プリプロセッサ ディレクティブ

   
#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のデバッグのためのチェックサムを生成する

記述上の制約

#if

#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

コンパイルの適用範囲がメソッド全体ならば、ConditionalAttribute属性を指定することでも対応できます。テスト用コードをデバッグ時にのみ実行するには?:.NET TIPS - @IT 一色政彦 (2005/01/07)

[Conditional("DEBUG")]
public static void Test()
{
}
ConditionalAttribute クラス (System.Diagnostics) | Microsoft Learn

この場合"DEBUG"が定義されていないと、Test()は呼び出されません。

この属性を指定するメソッドの戻り値の型はvoidでなくてはならず、これに違反すると「戻り値の型が void ではないため、条件付き属性は '***' では無効です。」としてCS0578のエラーとなります。

#define

この#defineと#undefは、プログラムの他のキーワードより前に記述しなければなりません。Compiler Error CS1032 | Microsoft Learn

定義されたシンボルのスコープは、それが定義されたファイル内です。これをすべてのファイルとしたいならば、-defineオプションで指定します。

C++の#defineとは異なり、識別子の置換はできません。

#pragma warning

  • #pragma warning disable warning-list … 警告を無効にする
  • #pragma warning restore warning-list … 警告を有効にする

複数の警告はカンマで区切り、接頭辞の"CS"は省略できます。

#pragma warning disable 414, CS3021

警告番号を省略した場合は、すべての警告が無効または有効になります。

この指定をすべてのコードに適用するには、コンパイラ オプションの/nowarnで指定します。これはVisual Studioからならば、プロジェクトのプロパティの[ビルド]にある[警告を表示しない]から設定できます。Errors and Warnings - Build Page, Project Designer (C#) - Visual Studio | Microsoft Learn

これはコンパイラの警告に対して適用するものであり、コード分析の警告には別の方法で指定します。

Microsoft Learnから検索