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