
Για χρόνια έχω με τη σταθερή DEBUG compiler σε VB.NET να γράψει μηνύματα στην κονσόλα. Έχω, επίσης, χρησιμοποιώντας System.Diagnostics.Debug.Write με παρόμοιο τρόπο. Ήταν πάντα κατανόησή μου είναι ότι όταν ΤΥΠΟΥ χρησιμοποιήθηκε ως επιλογή κατασκευής, ότι όλες αυτές οι καταστάσεις έχουν μείνει έξω από τον compiler, ελευθερώνοντας τον κωδικό σας παραγωγής της εναέριας των δηλώσεων εντοπισμού σφαλμάτων. Πρόσφατα, όταν ασχολούνται με το Silverlight 2 Beta 2, παρατήρησα ότι το Visual Studio στην πραγματικότητα συνδέεται με ένα μεταγλώττισης που έτρεχε μακριά από μια δημόσια ιστοσελίδα και εμφανίζεται δηλώσεις DEBUG που υπέθεσα δεν είχαν ακόμα συνταχθεί! Τώρα, πρώτη κλίση μου είναι να υποθέσουμε ότι κάτι δεν πάει καλά με το περιβάλλον μου, αλλά θέλω επίσης να ζητήσει κανείς με βαθιά γνώση σχετικά με System.Diagnostics.Debug και την επιλογή κατασκευή εντοπισμού σφαλμάτων σε γενικές γραμμές αυτό που μπορεί να παρανόηση εδώ.

 
ΝΕΤ Compiler - DEBUG εναντίον ΑΠΟΔΕΣΜΕΥΣΗ
=========================================



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


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



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

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write ().

 

Σύμφωνα με την εμπειρία μου επιλογή μεταξύ εντοπισμού σφαλμάτων και έκδοσης σε VB.NET δεν κάνει καμία διαφορά. Μπορείτε να προσθέσετε προσαρμοσμένες ενέργειες τόσο για τη διαμόρφωση, αλλά από προεπιλογή νομίζω ότι είναι το ίδιο.


Χρησιμοποιώντας Τύπου σίγουρα δεν θα αφαιρέσει τα System.Diagnostics.Debug.Write δηλώσεις.

 

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



```
public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}

```
 

Χρησιμοποιώντας το σύμβολο DEBUG compiler θα, όπως είπατε, παραλείψετε στην πραγματικότητα τον κωδικό από το συγκρότημα.


Πιστεύω ότι System.Diagnostics.Debug.Write θα είναι πάντα εξόδου σε ένα συνημμένο πρόγραμμα εντοπισμού σφαλμάτων, ακόμη και αν έχετε χτίσει σε λειτουργία κυκλοφορίας. Σύμφωνα με την [άρθρο MSDN](https://msdn.microsoft.com/en-us/library/system.diagnostics.debug.write.aspx) :



> 
> Γράφει πληροφορίες σχετικά με τον εντοπισμό σφαλμάτων στους ακροατές ίχνος της συλλογής ακροατές. 
> 
> 
> 


Αν δεν θέλετε *καμία* εξόδου, θα πρέπει να τυλίξετε κλήση σας για να Debug.Write με τη συνεχή DEBUG όπως Χουάν είπε:



```
#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif

```
 

Διάβασα το άρθρο πάρα πολύ, και αυτό με οδήγησε στο συμπέρασμα ότι, όταν DEBUG δεν ορίζεται, ότι η ConditionalAttribute δήλωσε στις λειτουργίες System.Debug θα προκαλέσει ο compiler να φύγει από αυτόν τον κώδικα εντελώς. Υποθέτω ότι το ίδιο πράγμα για να είναι αληθινό για TRACE. Δηλαδή, οι λειτουργίες System.Diagnostics.Debug πρέπει να έχουν ConditionalAttributes για DEBUG και για TRACE. Έκανα λάθος σε αυτή την υπόθεση. Η ξεχωριστή κατηγορία Trace έχει τις ίδιες λειτουργίες, και αυτές καθορίζουν ConditionalAttribute εξαρτάται από τη συνεχή TRACE.


Από System.Diagnostics.Debug: \_ Δημόσια Κοινόχρηστο Sub Γράψτε (\_ μήνυμα As String \_)


Από System.Diagnostics.Trace: \_ Δημόσια Κοινόχρηστο Sub WriteLine (\_ μήνυμα As String \_)


Φαίνεται τότε ότι η αρχική υπόθεση μου ήταν σωστή, ότι System.Diagnostics.Debug (ή system.Diagnostics.Trace) καταστάσεις στην πραγματικότητα δεν περιλαμβάνονται στη συλλογή σαν να είχαν συμπεριληφθεί στο #if DEBUG (ή #if TRACE) περιοχές. 


Αλλά έχω μάθει επίσης εδώ από σας παιδιά, και επαλήθευσε, ότι η κατασκευή ΤΥΠΟΥ από μόνη της δεν φροντίσει γι 'αυτό. Τουλάχιστον με το Silverlight έργα, τα οποία είναι ακόμα λίγο φύλλο, θα πρέπει να μπει στο «Επιλογές για προχωρημένους Compile ...» και βεβαιωθείτε ότι DEBUG δεν ορίζεται. 


Εμείς πήδηξε από το .NET 1.1 / VS2003 σε .NET 3.5 / VS2008 και έτσι νομίζω ότι μερικά από αυτό που χρησιμοποιείται για να λειτουργήσει με διαφορετικό τρόπο, αλλά ίσως αλλάξει 2.0 / VS2005.

 

Εξετάστε το [Debug.Write](https://msdn.microsoft.com/en-us/library/54ffa64k.aspx) μέθοδο. Είναι σημειωμένα με το



```
[Conditional("DEBUG")]

```

Χαρακτηριστικό.


Η βοήθεια MSDN για [ConditionalAttribute](https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx) αναφέρει:



> 
> Δείχνει να μεταγλωττιστές που θα πρέπει να αγνοηθεί η κλήση μέθοδο ή ιδιότητα, εκτός εάν ένα συγκεκριμένο **ορίζεται σύμβολο προϋποθέτει την κατάρτιση** .
> 
> 
> 


Είτε η διαμόρφωση κατασκευής έχει μια ετικέτα απελευθέρωσης ή debug δεν έχει σημασία, αυτό που έχει σημασία είναι αν το σύμβολο DEBUG ορίζεται σε αυτήν.

 

Για να επιλέξετε αν θέλετε οι πληροφορίες εντοπισμού σφαλμάτων που πρέπει να καταρτιστούν ή να αφαιρεθεί,


εισέλθουν στην καρτέλα «Δημιουργία» στο παράθυρο ιδιοτήτων του έργου.


Επιλέξτε τη σωστή ρύθμιση παραμέτρων (Active / Release / Debug / All) και βεβαιωθείτε ότι έχετε ελέγξει την «debug Constant» αν θέλετε τις πληροφορίες, ή καταργήστε την επιλογή αυτή αν δεν το κάνουν.


Εφαρμογή αλλαγών και για την ανοικοδόμηση

 