プリプロセッサとは
コンパイルの前に処理を行う機能。
プリプロセッサディレクティブは#defineなど#で始まる指示語。
コンパイルシンボル
デバッグビルドとリリースビルドで処理を分けたい場合などに使う。
コンパイルシンボルとは、#if , #elif #else #endifディレクティブと組み合わせて使うシンボル語のこと。
デフォルトでDEBUG(デバッグビルド)、RELEASE(リリースビルド)、TRACE(両方)のシンボルが用意されている。
デバッグビルド:デバッグに最適化された構成
リリースビルド:パフォーマンスに最適化された構成
独自にコンパイルシンボルを定義したい場合は#defineを使う。#defineはプログラムの先頭で、名前空間宣言当の他のキーワードの前に指定する必要がある。シンボルの定義を解除する場合は#undefを使う。
また、プロジェクトのプロパティ→ビルド や、プロジェクトファイルの<ProjectGroup>の<DefineConstants>で定義することもできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#define AAAA #if DEBUG Console.WriteLine("DEBUG"); #endif #if RELEASE Console.WriteLine("RELEASE"); #endif #if TRACE Console.WriteLine("TRACE"); #endif #if AAAA Console.WriteLine("AAAA"); #endif |
デバッグのときのみ実行されるメソッドを定義する
以下のABC()はデバッグ時のみ実行される。
1 2 3 4 5 6 7 8 |
ABC(); //条件付きメソッド デバッグのときだけ実行されるメソッド [System.Diagnostics.Conditional("DEBUG")] static void ABC() { Console.WriteLine("ABC"); } |
意図的にコンパイルエラー/警告を出力する
意図的にエラーや警告を出力するには#errorや#worningを使う。
#lineを使うと、指定した場所(行番号・ファイル名)でエラーが発生したように見せかけることができる。ファイル名は実際に存在するファイルでなくてもよい。
以下の5行目の例では、#lineから下のエラーの発生場所はtest.csファイルの100行目〜となる。
1 2 3 4 5 6 7 8 9 10 11 12 |
#error エラーです #warning このソースファイルは未完成です #line 100 "test.cs" var number; //初期化子がないためエラー #line 200 //ファイルは無しで行番号だけ指定 var number2; #line default //通常の表示に戻る var number3; |
エディターでグループを折りたたむ
#region~#endregionまでをエディタで折りたたむことができる。(対応エディタのみ)
ラベルを付けたい場合は「#region ラベル」と書く。折りたたんだ時にはラベルのみが表示される。
1 2 3 4 5 6 7 |
#region Greetings Console.WriteLine("おはよう"); Console.WriteLine("こんにちは"); Console.WriteLine("こんばんは"); #endregion |
警告を無効にする
1 2 3 4 5 6 7 8 9 |
//警告を無効にする #pragma warning disable //指定されたコードの警告を無効にする #pragma warning disable CS0168 int a; //null許容参照機能からの警告を無効にする #pragma warning disable nullable |
今日の英単語
diagnostics:診断
Conditional:条件付き
参考サイト
MCP 70-483 Programming in C# のお勉強 「3-4 アプリケーションをデバッグする」 – Qiita
プリプロセッサ ディレクティブ | C# プログラミング解説 (so-zou.jp)
C#8.0 #nullableディレクティブにおける注釈・警告コンテキストについて – やってみる (hatenablog.com)
参考書籍
Ian Griffiths著 プログラミングC#