#if DEBUG
対 [Conditional("DEBUG")]
: 賢い選択
大規模プロジェクトの開発では、2 つの条件付きコンパイル方法 #if DEBUG
と [Conditional("DEBUG")]
の選択が重要です。最適なパフォーマンスとコードの明瞭さを確保するには、この 2 つの微妙な違いを理解することが重要です。
#if DEBUG
: コード
#if DEBUG
コンパイル中の DEBUG シンボルの有無に基づいて、コードを条件付きでコンパイルします。 #if DEBUG
ブロック内のコードはソース コード内に存在しますが、リリース モード (つまり、DEBUG シンボルなし) でコンパイルされるときに中間言語 (IL) から除外されます。これにより、不要な命令が IL に含まれないため、パフォーマンスが大幅に向上します。
[Conditional("DEBUG")]
: コンパイル時に
対照的に、[Conditional("DEBUG")]
はメソッドを変更し、DEBUG シンボルの存在に関係なく IL に含める必要があることを指定します。ただし、[Conditional("DEBUG")]
でマークされたメソッドへの呼び出しは、呼び出し元アセンブリに DEBUG シンボルが存在しない限り、コンパイル時に省略されます。これにより、リリース ビルドのパフォーマンスに影響を与えることなく、コンパイルされたコード内にメソッドが存在できるようになります。
適切な方法を選択してください
2 つの方法の選択は、使用目的によって異なります。
#if DEBUG
: は、リリース ビルドから完全に除外する必要があるコード (デバッグ ログ、パフォーマンス カウンターなど) に適しています。 [Conditional("DEBUG")]
: は、すべてのバージョンに存在する必要があるメソッド用ですが、必要な場合にのみ呼び出されます (検証チェック、パラメータ検証など)。 使用例
#if DEBUG
:
<code class="language-csharp">#if DEBUG public void SetPrivateValue(int value) { ... } #endif</code>
この場合、プライベート値を設定するコードは、DEBUG シンボルが存在する場合にのみコンパイルされ、リリース ビルドをクリーンな状態に保ちます。
[Conditional("DEBUG")]
:
<code class="language-csharp">[Conditional("DEBUG")] protected void VerifyPropertyName(String propertyName) { ... }</code>
このメソッドはコンパイルされた IL に常に存在しますが、このメソッドの呼び出しは、呼び出し元アセンブリに DEBUG シンボルが存在する場合にのみ含まれます。
条件付きネストに [Conditional("DEBUG")]
を使用しないでください
[Conditional("DEBUG")]
を使用すると、呼び出し自体が #if DEBUG
ブロック内にある場合でも、メソッドの呼び出しはコンパイル時に省略されます。これにより、条件の面倒なネストの必要性が回避されます。
<code class="language-csharp">#if DEBUG public void DoSomething() { } #endif public void Foo() { #if DEBUG DoSomething(); // 这种方法很繁琐,而且视觉上不美观 #endif }</code>
比較:
<code class="language-csharp">[Conditional("DEBUG")] public void DoSomething() { } public void Foo() { DoSomething(); // 代码更简洁,并且只有在定义了 DEBUG 时才包含调用 }</code>
結論
#if DEBUG
と [Conditional("DEBUG")]
の微妙な違いを理解することで、開発者は条件付きコンパイルについて情報に基づいた選択を行うことができます。適切なアプローチを選択することで、プロジェクトはより高いパフォーマンス、よりクリーンなコード、より短い開発時間の恩恵を受けることができます。
以上が`#if DEBUG` と `[Conditional('DEBUG')]`: どちらの条件付きコンパイル アプローチを選択する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。