26

これは簡単な質問だと思うので、明らかな何かが欠けていると思います。私は実際にはプリプロセッサ ディレクティブを使用したことはありませんが、誰かのコードを見ていて、それは私が慣れ親しんでおくべきものだと思っていました。

だから私はここにコードがあるmsdnの例を見ました:

#define DEBUG
// ...
#if DEBUG
    Console.WriteLine("Debug version");
#endif

私の2つの質問は次のとおりです。

  • 上記の例では、なぜ DEBUG を定義しているのでしょうか? デバッグ対リリースモードでコンパイルすると設定された印象を受けましたか?
  • 「定義済み」かどうかに応じてコンソールに書き込み、コンソールに書き込む他の例を見てください。しかし、これ#define MYTESTは単に変数を使用することとどう違うのでしょうか? ここで何が欠けていますか?
4

7 に答える 7

18

実際には、インライン #if ステートメントの代わりに条件付き属性を使用することをお勧めします。

[Conditional("DEBUG")]
private void DeleteTempProcessFiles()
{
}

コード内に #if、#else が含まれないため、これはよりクリーンで読みやすいだけではありません。このスタイルは、通常のコード編集中やロジック フロー エラーのいずれにおいても、エラーが発生しにくくなります。

于 2010-11-19T05:56:10.350 に答える
9

通常、オプション/条件付きコンパイルシンボルはビルドスクリプトによって提供されます。非常に#defineデバッグコードを除いて、表示されることは非常にまれです(私の意味が表示されている場合)。

変数を再使用します。私はよくこのような条件を使用して、さまざまなランタイム(mono、cf、silverlightなど)で実行する必要のあるコードを処理します。間違ったプラットフォーム(タイプ/メソッドの欠落など)に対してコードをコンパイルできないため、変数では不十分です。

提示された例では、おそらく使用しただけでしょうDebug.WriteLine。これはで装飾されているため、ビルド時に定義されていない[Conditional("DEBUG")]場合、それに対するすべての呼び出しは自動的に削除されます。DEBUG

于 2010-11-19T05:41:10.963 に答える
5

上記の例では、なぜ DEBUG を定義しているのでしょうか? デバッグ対リリースモードでコンパイルすると設定された印象を受けましたか?

おそらくサンプルコードだからです。これは#ifdef、友人がどのように機能するかを示すことを目的としています。簡単なテストでない限り、ソースファイルでそのようなシンボルを定義することは期待できません。

「#define MYTEST」があり、「定義」されているかどうかに応じてコンソールに書き込む他の例を見ると、変数を使用するだけとどう違うのでしょうか? ここで何が欠けていますか?

コンパイル時に MYTEST が定義されていない場合、コンパイラはブロック#if#endifブロックの間のコードを実際には出力しません。したがって、結果の IL は小さくなります。

また、これらはC# のプリプロセッサ ディレクティブではないことに注意してください。

于 2010-11-19T05:32:08.197 に答える
4

プロジェクトでプリプロセッサ ディレクティブを使用した例を 1 つ挙げたいと思います。

私のプログラムは、ディスク上に多くの中間ファイルを作成します。プロジェクトがリリース モードの場合にのみ #DEBUG ディレクティブを使用してこれらのファイルを削除しました。

私のアプリが運用サーバーで動作している場合、プロジェクトをリリース モードでビルドして、処理が完了した後にそれらのファイルが削除されるようにします。

#if (DEBUG==false)
    deleteTempFiles()
#endif
于 2010-11-19T05:45:52.883 に答える
4

variable を使用すると、すべてのコードがコンパイルされます。プリプロセッサ ディレクティブを使用すると、executable/dll に含まれるコードの一部のみがコンパイルされます。

于 2010-11-19T05:28:29.067 に答える
2

CLR の代わりに Mono 環境を使用する場合、別の処理が必要なコードがいくつかあります。そのため、モジュールの一部に Mono ディレクティブがあります。これはデバッグよりも良い例だと思います

于 2010-11-19T05:37:31.063 に答える
1

私は多くのことにそれを使用しました。デバッグ ビルドでのみ必要なデバッグ メッセージ。一時ファイルをクリーンアップします。診断機能またはアクションを含めます。

于 2014-03-14T15:22:25.280 に答える