Bedingt ("Debug") + #if DEBUG

8

Ich habe in Debuggen .net 2.0 Anwendungen den folgenden Code gesehen

%Vor%

Gibt es einen Grund, die #if-Anweisung zu verwenden? Ich meine, von dem, was ich verstehe, wird die Methode nur aufgerufen, wenn der DEBUG definiert ist, also sehe ich keinen Sinn darin, das #if im Methodenkörper zu haben.

    
devoured elysium 20.09.2009, 23:42
quelle

2 Antworten

20

Zufällig habe ich zufällig letzte Woche Ihre Frage in meinem Blog beantwortet.

Ссылка

Die Anweisung #if ist notwendig, wenn der Hauptteil der Methode auf Entitäten verweist, die selbst unter #if DEBUG-Anweisungen deklariert sind. Zum Beispiel

%Vor%

Das würde im Release-Build nicht kompiliert, wenn Sie das #if DEBUG im Methodentext weggelassen hätten.

    
Eric Lippert 21.09.2009, 00:02
quelle
9

Tatsächlich gibt es viele Unterschiede. ConditionalAttribute sieht im Code sauberer aus, hat aber viele Einschränkungen und mindestens einen Vorteil gegenüber #if.

  • #if entfernt Code vollständig aus der Kompilierung, wenn das Symbol nicht definiert ist.

  • #if gibt Ihnen eine bessere Kontrolle über die Granularität - Sie können eine Zeile innerhalb einer Methode oder ganzen Methode oder bestimmte Mitglieder einer Klasse sogar der ganzen Klasse umgeben.

  • Mit

    #if können Sie komplexe Bedingungen wie diese schreiben:

    %Vor%
  • #if hat #else und #elif , um komplexere Szenarien zuzulassen.

  • [Bedingt] gilt nur für eine einzelne vollständige Methode, die void zurückgibt.

  • [Bedingt] enthält Code in die kompilierte Assembly, entfernt jedoch alle Aufrufe an sie. Wenn jemand auf Ihre Assembly verweist, würde er Methoden sehen, die mit [Bedingt] markiert sind und diese verwenden könnten - das können Sie mit #if nicht erreichen.

Es ist interessant, .NET Framework-Baugruppen mit Reflektoren zu öffnen, Methoden zu finden, die als Conditional ["DBG"] markiert sind, und deren Verwendung zu sehen. Keiner von ihnen, auch nicht interne, wird überall verwendet! Das liegt daran, dass Microsoft .Net für die Veröffentlichung ohne Symbol "DBG" kompiliert hat, aber sie benutzten diese Methoden, um .Net während der Entwicklung zu debuggen.

>
  • Es ist nicht möglich, zwei Methoden mit denselben Signaturen zu verwenden, die mit [Bedingt] markiert sind, aber Sie können dies mit #if erreichen.

Als letzte Anmerkung muss ich sagen, dass die bedingte Kompilierung manchmal böse Spiele spielt, wenn Sie in den Debug- und Release-Versionen völlig anderes Verhalten bekommen und Sie erst nach der Bereitstellung Ihres Codes davon erfahren und die Benutzer sich beschweren. Als Faustregel versuchen Sie, das Verhalten mit #if nicht zu ändern. Verwenden Sie es nur, um Eingabedaten zu ändern.

Hier ist ein Beispiel für die Verwendung von #if - verschiedene Anwendungskonfigurationen für Debug- und Release-Versionen.

%Vor%     
Konstantin Spirin 21.09.2009 02:42
quelle

Tags und Links