#if DEBUG と Conditional("DEBUG") の比較 質問する

#if DEBUG と Conditional(

大規模プロジェクトではどちらを使用するのがよいですか。その理由も教えてください。

#if DEBUG
    public void SetPrivateValue(int value)
    { ... }
#endif

または

[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }

ベストアンサー1

それはあなたが何を目指しているかによって大きく異なります:

  • #if DEBUG: ここにあるコードはリリース時に IL にさえ到達しません。
  • [Conditional("DEBUG")]: このコードは IL に到達しますが、呼び出し元がコンパイルされるときに DEBUG が設定されていない限り、メソッドへの呼び出しは省略されます。

個人的には、状況に応じて両方を使用します。

Conditional("DEBUG") の例:リリース中に後でコードに戻って編集する必要がないようにこれを使用しますが、デバッグ中は入力ミスがないことを確認する必要があります。この関数は、INotifyPropertyChanged で使用しようとするときに、プロパティ名が正しく入力されているかどうかを確認します。

[Conditional("DEBUG")]
[DebuggerStepThrough]
protected void VerifyPropertyName(String propertyName)
{
    if (TypeDescriptor.GetProperties(this)[propertyName] == null)
        Debug.Fail(String.Format("Invalid property name. Type: {0}, Name: {1}",
            GetType(), propertyName));
}

#if DEBUG同じ でその関数へのすべての呼び出しをラップするつもりがない限り、を使用する関数を作成したくはありません#if DEBUG

#if DEBUG
    public void DoSomething() { }
#endif

    public void Foo()
    {
#if DEBUG
        DoSomething(); //This works, but looks FUGLY
#endif
    }

対:

[Conditional("DEBUG")]
public void DoSomething() { }

public void Foo()
{
    DoSomething(); //Code compiles and is cleaner, DoSomething always
                   //exists, however this is only called during DEBUG.
}

#if DEBUG の例: WCF 通信に異なるバインディングを設定するときにこれを使用します。

#if DEBUG
        public const String ENDPOINT = "Localhost";
#else
        public const String ENDPOINT = "BasicHttpBinding";
#endif

最初の例では、コードはすべて存在しますが、DEBUG がオンになっていない限り無視されます。2 番目の例では、DEBUG が設定されているかどうかに応じて、const ENDPOINT が "Localhost" または "BasicHttpBinding" に設定されます。


更新: 重要かつ難しい点を明確にするために、この回答を更新しています。 を使用する場合は、呼び出しはコンパイル時に省略され、実行時には省略されないConditionalAttributeことに注意してください。つまり、

マイライブラリ.dll

[Conditional("DEBUG")]
public void A()
{
    Console.WriteLine("A");
    B();
}

[Conditional("DEBUG")]
public void B()
{
    Console.WriteLine("B");
}

ライブラリがリリース モード (つまり、DEBUG シンボルなし) に対してコンパイルされると、呼び出しアセンブリで DEBUG が定義されているため への呼び出しが含まれていても、B()内からの への呼び出しは永久に省略されます。A()A()

おすすめ記事