C# Language
プリプロセッサディレクティブ
サーチ…
構文
- #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の[プロジェクトプロパティ] - [ビルド] - [条件付きコンパイルシンボル]で定義できます。
( DEBUG
とTRACE
は独自のチェックボックスがあり、明示的に指定する必要はありません)。
または、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
}