[解決済み] #if DEBUG vs. Conditional("DEBUG")
質問
大規模なプロジェクトで、どちらを使うのが良いか、またその理由は?
#if DEBUG
public void SetPrivateValue(int value)
{ ... }
#endif
または
[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }
解決方法は?
それは、あなたが何を目指しているかによります。
-
#if DEBUG
: ここにあるコードは、リリース時にILに届くこともないでしょう。 -
[Conditional("DEBUG")]
: このコードはILに届きますが が呼び出されます。 は、呼び出し側がコンパイルされるときに DEBUG が設定されない限り、メソッドへのアクセスは省略されます。
個人的には、状況に応じて両方を使い分けています。
条件付き("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
は、コンパイル時に呼び出しが省略されることを覚えておいてください。
実行時ではなく
. ということです。
MyLibrary.dll
[Conditional("DEBUG")]
public void A()
{
Console.WriteLine("A");
B();
}
[Conditional("DEBUG")]
public void B()
{
Console.WriteLine("B");
}
ライブラリがリリースモード(つまりDEBUGシンボルなし)に対してコンパイルされた場合、永遠に
B()
の中から
A()
への呼び出しが省略された場合でも
A()
が含まれるのは、呼び出し側のアセンブリでDEBUGが定義されているからです。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] Wi-Fi経由でAndroidアプリケーションを実行/インストール/デバッグしますか?
-
[解決済み] C#のif/thenディレクティブによるデバッグとリリースの比較
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み] C# プリプロセッサーでのマクロ定義