| #if symbol | symbolが定義されているときの、コンパイルの範囲を定義する |
| #else | |
| #elif symbol | |
| #endif | |
| #define symbol | symbolを定義する |
| #undef symbol | symbolを未定義にする |
| #warning text | コンパイラの出力に、textを警告として含める |
| #error text | コンパイラの出力に、textをエラーとして含める |
| #line number | コンパイラのエラーと警告で表示される、行番号とファイル名を変更する |
| #region name | Visual Studioのコード エディターのアウトライン機能のための、コード ブロックの指定 |
| #endregion name | |
| #pragma warning | 警告を抑制する (C# 2.0以降) |
| #pragma checksum | ASP.NETのデバッグのためのチェックサムを生成する |
#define DEBUG
#if DEBUG
// デバッグ時に実行
#else
// リリース時に実行
#endif
#if !DEBUG
// リリース時に実行
#endif
#if (A && !B)
// Aが定義されている
#elif (!A && B)
// Bが定義されている
#elif (A && B)
// AとBが定義されている
#else
// AもB定義されていない
#endif
条件付きコンパイル - C# プリプロセッサ ディレクティブ | Microsoft Learn
#if (A && !B)は#if A && !Bのように、かっこがなくても構いません。
コンパイルの適用範囲がメソッド全体ならば、ConditionalAttribute属性を指定することでも対応できます。テスト用コードをデバッグ時にのみ実行するには?:.NET TIPS - @IT 一色政彦 (2005/01/07)
[Conditional("DEBUG")]
public static void Test()
{
}
ConditionalAttribute クラス (System.Diagnostics) | Microsoft Learn
この場合"DEBUG"が定義されていないと、Test()は呼び出されません。
この属性を指定するメソッドの戻り値の型はvoidでなくてはならず、これに違反すると「戻り値の型が void ではないため、条件付き属性は '***' では無効です。」としてCS0578のエラーとなります。
この#defineと#undefは、プログラムの他のキーワードより前に記述しなければなりません。Compiler Error CS1032 | Microsoft Learn
定義されたシンボルのスコープは、それが定義されたファイル内です。これをすべてのファイルとしたいならば、-defineオプションで指定します。
C++の#defineとは異なり、識別子の置換はできません。
複数の警告はカンマで区切り、接頭辞の"CS"は省略できます。
#pragma warning disable 414, CS3021
警告番号を省略した場合は、すべての警告が無効または有効になります。
この指定をすべてのコードに適用するには、コンパイラ オプションの/nowarnで指定します。これはVisual Studioからならば、プロジェクトのプロパティの[ビルド]にある[警告を表示しない]から設定できます。Errors and Warnings - Build Page, Project Designer (C#) - Visual Studio | Microsoft Learn
これはコンパイラの警告に対して適用するものであり、コード分析の警告には別の方法で指定します。