大規模プロジェクトではどちらを使用するのがよいですか。その理由も教えてください。
#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()