Αποτροπή δημιουργίας της τάξης των οποίων οι λειτουργίες μέλος είναι όλα στατικές




Όλες οι μεταβλητές μέλη και οι λειτουργίες του μέλους στην τάξη ClassA μου είναι στατική. 


Αν ένας χρήστης προσπαθεί (κατά λάθος) για να δημιουργήσετε ένα αντικείμενο αυτής της κατηγορίας, λαμβάνει μια προειδοποίηση: «ClassA, τοπική μεταβλητή δεν αναφέρεται», επειδή όλες οι λειτουργίες είναι στατική, έτσι ώστε αυτό το αντικείμενο δεν αναφέρεται. Έτσι, θέλω να αποτρέψει το χρήστη από την προσπάθεια να δημιουργήσει ένα αντικείμενο αυτής της κατηγορίας.


Θα ήταν αρκετό για να δημιουργήσει ένα ιδιωτικό default (χωρίς μεταβλητές) κατασκευαστή; Ή μήπως πρέπει να δημιουργήσει επίσης ιδιωτικό κατασκευαστή αντιγραφή και χειριστή ιδιωτικών ανάθεσης (για να αποφευχθεί χρησιμοποιώντας τις προεπιλεγμένες κατασκευαστές); Και αν χρειάζεται να τους δημιουργήσει πάρα πολύ, ίσως θα ήταν καλύτερα απλά για να δημιουργήσει κάποια εικονική καθαρό εικονική λειτουργία αντ 'αυτού, και αυτό θα αποτρέψει το χρήστη από το να δημιουργήσει ένα αντικείμενο;


Ευχαριστώ
Όπως και άλλοι είπαν, ένας χώρος ονομάτων είναι αυτό που πρέπει να χρησιμοποιήσετε. Αν θέλετε να μείνετε με την τάξη σας, να δημιουργήσετε μια τάξη που έχει ένα ιδιωτικό κατασκευαστή, και προέρχονται από αυτό, για να κάνουν την πρόθεσή σας προφανής:



```
class NonConstructible { 
    NonConstructible();
};

class SuperUtils: NonConstructible {
    static void foo();
    // ...
    static std::vector<int> globalIDs;
    // ...
};

```






Εντάξει, τώρα ας εξετάσουμε το χώρο ονομάτων που είναι ο ένας και μοναδικός τρόπος για να γίνει αυτό:



```
namespace SuperUtils {
    void foo() {
        // ....
    }

    std::vector<int> globalIDs;
};

```

Μπορείτε να καλέσετε ότι η χρήση `SuperUtils::foo();`και στις δύο περιπτώσεις, αλλά ο χώρος ονομάτων έχει το πλεονέκτημα ότι σε ένα πεδίο, μπορείτε να χρησιμοποιήσετε τη δήλωση namespace και οδηγία να φέρει ορισμένα ή όλα τα μέλη στο τρέχον πεδίο εφαρμογής, έτσι ώστε να μπορείτε να τους αναφορά χωρίς τη χρήση `SuperUtils::`:



```
void superFunction() {
    using namespace SuperUtils;
    foo();
}

```

Αν και σε γενικές γραμμές ότι πρέπει να αποφευχθεί, μπορεί να είναι χρήσιμο όταν η μέθοδος χρησιμοποιεί αποκλειστικά πολλά πράγματα από SuperUtils, το οποίο στη συνέχεια μπορεί να βελτιώσει την αναγνωσιμότητα του κώδικα.
Αυτή είναι η γνώμη μου, αλλά? όπως ακριβώς και οι τάξεις περίπτωση δεν, θα ήθελα να εφαρμόσουν μια `copy`μέθοδο του είδους στην τάξη για να καταστεί δυνατή η τροποποίηση, διατηρώντας παράλληλα το αμετάβλητο, αλλά υπάρχει ορισμένες περιπτώσεις που δεν μπορώ να βοηθήσω να το μεταβλητό? Για παράδειγμα, όταν κάτι αναμένεται να γίνει η λειτουργία αντιγραφής είναι πολύ μεγάλη και αργή για την κατηγορία? όπως όταν η τάξη έχει τόσα πολλά συχνά τροποποιημένο μέλη. Και μην ανησυχείτε για χιλιάδες περιπτώσεις που επιπλέουν γύρω στη μνήμη, επειδή είναι αυτόματα GC'ed, οπότε το πιο πραγματικό πρόβλημα είναι ο χρόνος κόστος της αντιγραφής περιπτώσεις της κλάσης. Παρακαλώ πείτε μου εάν η γνώμη μου είναι κάπως λάθος :) Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). <p>όπως μπορούμε <a href="https://github.com/rails/rails/blob/master/actionpack/lib/abstract\_controller/callbacks.rb">βλέπε</a> στο <code>actioncontroller::base</code>, <code>before\_action</code> είναι μόνο <a href="https://github.com/rails/rails/commit/9d62e04838f01f5589fa50b0baa480d60c815e2c">νέα σύνταξη</a> για <code>before\_filter</code>.</p><p>ωστόσο, όλες οι συνταγές <code>before\_filters</code> <a href="https://github.com/rails/rails/blob/v5.0.0.beta2/actionpack/lib/abstract\_controller/callbacks.rb#l190-l193">έχουν καταργηθεί</a> σε <strong> rails 5.0 </strong> και θα αφαιρεθούν σε <strong> rails 5.1 </strong></p> <p>το .net 4.0 επιτρέπει στα πρωτεύοντα σύνολα interop (ή μάλλον, τα bits που χρειάζεστε) να ενσωματωθούν στη συνέλευση σας, ώστε να μην χρειάζεται να τα αναπτύξετε παράλληλα με την εφαρμογή σας.</p><p>για οποιονδήποτε λόγο, αυτή η συνέλευση δεν μπορεί να ενσωματωθεί - αλλά αυτό ακούγεται σαν να μην είναι πρόβλημα για εσάς. ανοίξτε την καρτέλα ιδιότητες για τη συνέλευση στο visual studio 2010 και ορίστε "ενσωμάτωση τύπων interop" σε "false".</p><p>edit: δείτε επίσης την <a href="https://stackoverflow.com/a/4553402/641833">απάντηση</a> του michael gustus, καταργώντας το επίθημα <code>class</code> από τους τύπους που χρησιμοποιείτε.</p> <p><strong> συνολικά: </strong></p><p>τόσο το put όσο και το post μπορούν να χρησιμοποιηθούν για τη δημιουργία.</p><p>πρέπει να ρωτήσετε "σε τι εκτελείτε τη δράση;" να διακρίνετε τι πρέπει να χρησιμοποιείτε. ας υποθέσουμε ότι σχεδιάζετε ένα api για να κάνετε ερωτήσεις. εάν θέλετε να χρησιμοποιήσετε το post τότε θα το κάνετε σε μια λίστα ερωτήσεων. εάν θέλετε να χρησιμοποιήσετε το put τότε θα το κάνετε αυτό σε μια συγκεκριμένη ερώτηση.</p><p><strong> μεγάλη και οι δύο μπορούν να χρησιμοποιηθούν, έτσι ποιο πρέπει να χρησιμοποιήσω στο restful σχεδιασμό μου: </strong></p><p>δεν χρειάζεται να υποστηρίζετε τόσο το put όσο και το post.</p><p>το οποίο χρησιμοποιείται παραμένει στο χέρι σας. αλλά θυμηθείτε να χρησιμοποιήσετε το σωστό, ανάλογα με το αντικείμενο που αναφέρετε στο αίτημα.</p><p>μερικές σκέψεις:</p><ul> <li>ονομάζετε ρητά τα αντικείμενα url που δημιουργείτε ή αφήστε το διακομιστή να αποφασίσει; εάν τους ονομάσετε τότε χρησιμοποιήστε put. εάν αφήσετε τον διακομιστή να αποφασίσει στη συνέχεια, χρησιμοποιήστε το post.</li> <li>put είναι idempotent, οπότε αν put ένα αντικείμενο δύο φορές, δεν έχει καμία επίδραση. αυτή είναι μια ιδιοκτησία της νίκαιας, οπότε θα μπορούσα να χρησιμοποιήσω το put όταν ήταν δυνατόν.</li> <li>μπορείτε να ενημερώσετε ή να δημιουργήσετε έναν πόρο με put με την ίδια διεύθυνση url αντικειμένου</li> <li>με το post μπορείτε να έχετε 2 αιτήματα που εισέρχονται ταυτόχρονα για τροποποιήσεις σε μια διεύθυνση url και μπορεί να ενημερώσουν διαφορετικά μέρη του αντικειμένου.</li> </ul><p><strong> ένα παράδειγμα: </strong></p><p> <a href="https://stackoverflow.com/questions/256349/what-are-the-best-common-restful-url-verbs-and-actions/256359#256359">έγραψα τα εξής ως μέρος μιας άλλης απάντησης σχετικά με το so</a> :</p><blockquote> <p><strong> post: </strong></p> <p>χρησιμοποιείται για την τροποποίηση και την ενημέρωση ενός πόρου</p> <pre><code>post /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι το ακόλουθο είναι ένα σφάλμα:</p> <pre><code>post /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>εάν η διεύθυνση url δεν έχει δημιουργηθεί ακόμη, δεν θα πρέπει να χρησιμοποιείτε το post για να το δημιουργήσετε ενώ καθορίζετε το όνομα. αυτό θα πρέπει να έχει ως αποτέλεσμα ένα σφάλμα 'πόρος δεν βρέθηκε' επειδή το <code>&lt;new\_question&gt;</code> δεν υπάρχει ακόμα. πρέπει πρώτα να τοποθετήσετε τον πόρο <code>&lt;new\_question&gt;</code> στον διακομιστή.</p> <p>θα μπορούσατε όμως να κάνετε κάτι τέτοιο για να δημιουργήσετε πόρους χρησιμοποιώντας post:</p> <pre><code>post /questions http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι σε αυτήν την περίπτωση το όνομα του πόρου δεν έχει καθοριστεί, η διαδρομή url των νέων αντικειμένων θα σας επιστραφεί.</p> <p><strong> σημειωση: </strong></p> <p>χρησιμοποιείται για τη δημιουργία ενός πόρου ή για την αντικατάστασή του. ενώ ορίσετε τους πόρους νέα διεύθυνση url.</p> <p>για έναν νέο πόρο:</p> <pre><code>put /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>για να αντικαταστήσετε μια υπάρχουσα πηγή:</p> <pre><code>put /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre></blockquote> να τα πάρουμε με τη σειρά για να μη γίνει μπέρδεμα;

άρχικά, ένας αυτοματοποιημένος εγκαταστάτης μπορεί να μην εμφανίσει κάποιο μήνυμα λάθους αλλά αρκεί ένα τυπογραφικό λάθος στον κώδικά του για να μην πετύχει μια απλή ρύθμιση ας πούμε.

τώρα, το μενού του septor στο πρώτο screenshot αντιστοιχεί στη… τα εισαγωγικά είναι απαραίτητα όταν το όνομα περιέχει κενά. το static όνομα δεν πρέπει να περιέχει κενά, οπότε δεν είναι απαραίτητο.

σε ένα ποιο πολύπλοκο παράδειγμα

[image]

βάζω και τα δύο ονόματα και το static και το pretty, δες πως το πρώτο δεν έχει κενά. εδώ τα εισαγωγικά είναι απαραίτητα, ώσ… Είσαι σίγουρος ότι δεν είναι μόνο το όριο παράδειγμα σχετικά με το λογαριασμό που μπορείτε εύκολα να ζητήσετε Amazon για την αύξηση;


Σύμφωνα με [τα έγγραφα](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-vpc.html#vpc-only-instance-types) , αυτά είναι τα μόνα είδη παράδειγμα περιορίζεται σε ένα VPC αυτή τη στιγμή:


* C4
* M4
* Τ2
* X1


Όλοι οι άλλοι τύποι παράδειγμα, θα πρέπει να εξακολουθεί να είναι διαθέσιμη στο EC2 Classic. Συχνά αυτό επιτυγχάνεται με τη χρήση [«Driven δεδομένων Συνδρομές»](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , αλλά αυτή η λειτουργία είναι διαθέσιμη μόνο σε ορισμένες εκδόσεις του SQL: Enterprise και Business Intelligence, αλλά όχι στο πρότυπο.


Έτσι, υπάρχει μια σειρά από δημιουργικές λύσεις. Αλλά δεν μου αρέσει κάποια από αυτές, και απαιτούν ένα δίκαιο κομμάτι της εργασίας έξω από SSRS.


Οι λύσεις που έχω δει περιλαμβάνουν: Δημιουργία της εγγραφής και στη συνέχεια απενεργοποίηση ή επιτρέπουν την εργασία SQL που στέλνει τη συνδρομή (που προσδιορίζονται από GUID.)


Δημιουργήστε ένα .exe .NET περιτύλιγμα για να χειριστεί την αποστολή του email. Μπορεί να εκτελέσετε το ερώτημα πρώτα να δούμε πόσα επέστρεψε σειρές, και στη συνέχεια, αν χρειαστεί, να δημιουργήσει την έκθεση και να συμπεριληφθεί σε ένα email. ευχαριστώ για τις απαντήσεις και τις προτάσεις.

επειδή δε μπόρεσα να στήσω το windowappmenu όπως ήθελα, συνέχισα να παιδεύομαι με το default application panel και τελικά κατάφερα να το φτιάξω.

ήταν απλό τελικά…

αφού πατήσεις δεξί κλικ στο desktop και κάνεις “add panel > application menu bar”, το …