サーチ…


構文

  • #define [symbol] //コンパイラシンボルを定義します。
  • #undef [symbol] //コンパイラシンボルを定義解除します。
  • #warning [警告メッセージ] //コンパイラ警告を生成します。 #ifで便利です。
  • #error [エラーメッセージ] //コンパイラエラーを生成します。 #ifで便利です。
  • #line [行番号](ファイル名) //コンパイラ行番号(およびオプションでソースファイル名)を上書きします。 T4テキストテンプレートで使用されます
  • #pragma warning [disable | restore] [warning numbers] //コンパイラの警告を無効/復元します。
  • #pragma checksum " [ファイル名] " " [guid] " [チェックサム] "//ソースファイルの内容を検証します。
  • #region [region name] //折りたたみ可能なコード領域を定義します。
  • #endregion //コード領域ブロックを終了します。
  • #if [condition] //条件が真であれば、以下のコードを実行します。
  • #else // #ifの後に使用されます。
  • #elif [condition] // #ifの後に使用されます。
  • #endif // #ifで始まる条件ブロックを終了します。

備考

プリプロセッサディレクティブは通常、異なる実行環境で簡単にソースプログラムを変更しやすくコンパイルするために使用されます。ソースファイル内のディレクティブは、プリプロセッサに特定のアクションを実行するよう指示します。たとえば、プリプロセッサは、テキスト内のトークンを置き換えたり、他のファイルの内容をソースファイルに挿入したり、テキストのセクションを削除してファイルの一部のコンパイルを抑止したりすることができます。プリプロセッサラインは、マクロ展開の前に認識され実行されます。したがって、マクロがプリプロセッサコマンドのように見えるものに展開された場合、そのコマンドはプリプロセッサによって認識されません。

プリプロセッサ・ステートメントは、ソース・ファイル・ステートメントと同じキャラクタ・セットを使用しますが、エスケープ・シーケンスはサポートされません。プリプロセッサ文で使用されるキャラクタ・セットは、実行キャラクタ・セットと同じです。プリプロセッサは、負の文字値も認識します。

条件式

条件式( #if#if #elifなど)は、ブール演算子の限定されたサブセットをサポートします。彼らです:

  • ==!= 。これらは、シンボルが真(定義)か偽(定義されていない)かどうかのテストにのみ使用できます。
  • &&||!
  • ()

例えば:

#if !DEBUG && (SOME_SYMBOL || SOME_OTHER_SYMBOL) && RELEASE == true
Console.WriteLine("OK!");
#endif

「OK!」と表示されるコードをコンパイルします。 DEBUGが定義されていない場合は、 SOME_SYMBOLまたはSOME_OTHER_SYMBOLが定義され、 RELEASEが定義されている場合は、コンソールに表示されます。

注:これらの置換はコンパイル時に行われるため 、実行時に検査することはできません。 #ifを使用して削除されたコードは、コンパイラの出力の一部ではありません。

関連項目:MSDNのC#プリプロセッサディレクティブ

条件式

以下がコンパイルされると、どのディレクティブが定義されているかによって異なる値が返されます。

// Compile with /d:A or /d:B to see the difference
string SomeFunction() 
{
#if A
    return "A";
#elif B
    return "B";
#else
    return "C";
#endif
}

条件式は、通常、デバッグビルドの追加情報を記録するために使用されます。

void SomeFunc()
{
    try
    {
        SomeRiskyMethod();
    }
    catch (ArgumentException ex)
    {
        #if DEBUG
        log.Error("SomeFunc", ex);
        #endif

        HandleException(ex);
    }
}

コンパイラの警告とエラーの生成

コンパイラの警告を使用して生成することができ#warningディレクティブを、そしてエラーが同様に使用して生成することができます#errorディレクティブを。

#if SOME_SYMBOL
#error This is a compiler Error.
#elif SOME_OTHER_SYMBOL
#warning This is a compiler Warning.
#endif

シンボルの定義と定義解除

コンパイラシンボルは、コンパイル時に定義されるキーワードであり、条件付きでコードの特定のセクションを実行するためにチェックできます。

コンパイラシンボルを定義するには3つの方法があります。それらはコードによって定義することができます:

#define MYSYMBOL

Visual Studioの[プロジェクトプロパティ] - [ビルド] - [条件付きコンパイルシンボル]で定義できます。

VSコンパイラシンボル

DEBUGTRACEは独自のチェックボックスがあり、明示的に指定する必要はありません)。

または、C#コンパイラcsc.exe/define:[name]スイッチを使用してコンパイル時に定義できます。

また、 #undefineディレクティブを使用してシンボルを未定義にすることもできます。

最も一般的な例はDEBUGシンボルで、アプリケーションがデバッグモード(リリースモードと比較して)でコンパイルされたときにVisual Studioによって定義されます。

public void DoBusinessLogic()
{
    try
    {
        AuthenticateUser();
        LoadAccount();
        ProcessAccount();
        FinalizeTransaction();
    }
    catch (Exception ex)
    {
#if DEBUG
        System.Diagnostics.Trace.WriteLine("Unhandled exception!");
        System.Diagnostics.Trace.WriteLine(ex);
        throw;
#else
        LoggingFramework.LogError(ex);
        DisplayFriendlyErrorMessage();
#endif
    }
}

上記の例では、アプリケーションのビジネスロジックにエラーが発生すると、アプリケーションがデバッグモードでコンパイルされ( DEBUGシンボルが設定されていると)、エラーがトレースログに書き込まれ、例外が再び発生しますデバッグのために投げられます。ただし、アプリケーションがリリースモードでコンパイルされていて( DEBUGシンボルが設定されていない場合)、ロギングフレームワークを使用してエラーを静かに記録し、エンドユーザにフレンドリなエラーメッセージが表示されます。

地域ブロック

折りたたみ可能なコード領域を定義するには#region#endregionを使用します。

#region Event Handlers

public void Button_Click(object s, EventArgs e)
{
    // ...
}

public void DropDown_SelectedIndexChanged(object s, EventArgs e)
{
    // ...
}

#endregion

これらのディレクティブは、コードを編集するために折りたたみ可能な領域( Visual Studioなど)をサポートするIDEを使用する場合にのみ有益です。

その他のコンパイラの指示

ライン

#lineは、警告とエラーを出力するときにコンパイラによって報告される行番号とファイル名を制御します。

void Test()
{
    #line 42 "Answer"
    #line filename "SomeFile.cs"
    int life; // compiler warning CS0168 in "SomeFile.cs" at Line 42
    #line default
    // compiler warnings reset to default
}

プラグマチェックサム

#pragma checksumは、デバッグ用に生成されたプログラムデータベース(PDB)の特定のチェックサムを指定します。

#pragma checksum "MyCode.cs" "{00000000-0000-0000-0000-000000000000}" "{0123456789A}"

条件付き属性の使用

System.Diagnostics名前空間のConditional属性をメソッドに追加することは、ビルドで呼び出されるメソッドとそうでないメソッドを制御するクリーンな方法です。

#define EXAMPLE_A

using System.Diagnostics;
class Program
{
    static void Main()
    {
        ExampleA(); // This method will be called
        ExampleB(); // This method will not be called
    }

    [Conditional("EXAMPLE_A")]
    static void ExampleA() {...}

    [Conditional("EXAMPLE_B")]
    static void ExampleB() {...}
}

コンパイラ警告の無効化と復元

#pragma warning disableを使用してコンパイラの警告を#pragma warning disable#pragma warning restore#pragma warning restoreすることができます。

#pragma warning disable CS0168

// Will not generate the "unused variable" compiler warning since it was disabled
var x = 5;

#pragma warning restore CS0168

// Will generate a compiler warning since the warning was just restored
var y = 8;

カンマ区切りの警告番号を使用できます。

#pragma warning disable CS0168, CS0219

CSプレフィックスはオプションで、混在させることもできます(これはベストプラクティスではありません)。

#pragma warning disable 0168, 0219, CS0414

プロジェクトレベルでのカスタムプリプロセッサ

テストのためにいくつかのアクションをスキップする必要があるときに、プロジェクトレベルでカスタム条件付き前処理を設定すると便利です。

Solution Explorer移動 - >プロジェクトをクリックして、変数を設定する - > Properties - > Build - >一般検索フィールドConditional compilation symbolsを入力し、条件変数をここに入力します

ここに画像の説明を入力

いくつかのコードをスキップするコード例:

public void Init()
{
    #if !IGNOREREFRESHDB
    // will skip code here
     db.Initialize();
    #endif
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow