7

C# での #define ディレクティブの目的と適切な使用法は何ですか?

このトピックに関する質問はすでにほとんどありませんが、必要な回答はありません。彼らはそれがどのように機能するかの例を示しているだけです。しかし、もっと深い説明が必要です。なぜそれが存在するのか、そしてそれを使用する良い方法は何ですか (もしあれば)。

基本的に使い方はわかっているのですが、私には使い方が変に見えます。例を見てみましょう:

#define DEV

#if DEV
Console.WriteLine("Development trace log message");
#endif

私にとって、これはプロジェクト定義の条件付きコンパイル シンボルで #if 条件付きビルドを使用することとはまったく異なります。プロジェクト定義のシンボルを使用すると、プロジェクトのビルド構成にアタッチされ、ビルド構成を使用してビルドに必要な (およびビルドから除外される) コードを管理できます。だからコード

#if DEBUG
Console.WriteLine("Debug log message");
#endif

私には問題ありません。しかし、先ほども言いましたが、#define ディレクティブを使用するのとはまったく異なります。 最初の例は、ビルドごとに #define 行を手動でコメント/コメント解除することしかできないというのは正しいですか? はいの場合、それは管理しにくく、保守が難しく、この #define の使用法は非常に悪い習慣であり、言語にはまったく存在しないはずです。

#if ステートメント内で #define/#undef を使用することが想像できます。何かのようなもの

#if DEBUG
#if CLIENT1
#define TEST_CLIENT1
#endif
#endif

#if TEST_CLIENT1
connectionString = "Some specific test connection" //I know this is bad practice even in conditional. Only for example purpose.
#elif
//Read connection from config
#endif

#if UNITTESTS
#undef TEST_CLIENT1
#endif

#if TEST_CLIENT1
Console.WriteLine("Some message");
#endif

非常に複雑な例で申し訳ありませんが、それは少なくとも私が役立つと思うものです。私はそのようなコードを決して書きませんが=)。 #define の良い使い方はありますか?

PS: 私は #define yourself を 5 年間使用したことがなく、使用するつもりもありませんでしたが、奇妙な方法で名前を付けた多くの奇妙な定義を含むサポート プロジェクトを取得しました。これらの定義は、通常、最初の例のようにファイルの先頭に配置されます。そして、このコードを維持する方法がわかりません。

4

2 に答える 2

3

それがなければ、#IFステートメントは存在しません。

/defineコンパイラでディレクティブを使用してプロジェクト レベルの前提条件変数を定義する#DEFINEと、コードに a を追加するだけです。

/defineこれにより、ステートメント を使用してコードで手動で設定することはできませんが、これにより管理が容易になると主張します。

もう 1 つの有用性は、読みやすさと範囲です。プロジェクト定義ステートメントはプロジェクトに適用され、#DEFINEレベル ステートメントは 1 つのファイルにのみ適用されます。これにより、物事を整理して読みやすくし、さまざまな問題を防ぐことができます。

于 2012-07-27T09:58:46.683 に答える
1

「#define」が存在するのは、人々がそこにあると期待しているからです。:) 目的 (大規模なプロジェクトなど) では、プロジェクトにプリプロセッサ シンボルを保持する方が理にかなっている場合があります。迅速なデバッグやその他の目的では、#define が最良の選択かもしれません。さらに、#define を使用すると、シンボルをきめ細かく (ファイル レベルで) 制御できます。

大規模なコードベースと、問題を引き起こしている単一のモジュールがあるとします。'#define TRACE' または '#define DEBUG' は、パフォーマンス上の理由から、トレース/デバッグを有効にしたい単一のファイルでのみ使用したい場合があります。

于 2012-07-27T09:57:35.430 に答える