C#プリプロセッサ命令-0016

4244 ワード

プリプロセッシングめいれい
これらの命令/コマンドは実行可能コードに変換されませんが、コンパイルプロセスの各方面に影響します.列は、コンパイラがコードの一部をコンパイルしないようにするなどします.
C#における主な前処理命令
#defineと#undef
#define命令定義:
#define DEBUG

コンパイラにDEBUGという記号があることを示します.この記号は実際のコードの一部ではなく、コンパイラがコードをコンパイルするときにこの記号に基づいて条件コンパイルする可能性があります.
#undef定義:
#undef DEBUG

定義されたシンボルDEBUGを削除します.このようなタグが存在しない場合、undefコマンドは有効になりません.同様に、同じ名前のタグをdefineで再定義しても何の変化もありません.
注意:
  • 実際のビジネスコードが開始される前に、defineコマンドとundefコマンドを書く必要があります.
  • #define自体は何の役にも立たず、他のプリプロセッサ命令と組み合わせて使用する必要がある.例えば#if
  • #if,#elif,#elseおよび#endif
    これらのコマンドは、コンパイラが含まれるコードブロックをコンパイルするかどうかを示します.例:
    int DoSomeWork(double x)
    {
    	// do something
    	#if DEBUG
    		Console.WriteLine($"x is {x}");
    	#endif
    }
    

    このコードのConsole.Writeline文は、前に#define命令で記号DEBUGを定義してからコンパイルするときに、本当にコンパイルされます.
    コンパイラがDEBUG記号を発見しない場合、コンパイル時にこのコードを無視します. 
    #elif(=else if)および#else命令は、#ifブロックで使用することができる.
    #define ENTERPRISE
    #define W10
    // further on in the file
    #if ENTERPRISE
    // do something
    	#if W10
    	// some code that is only relevant to enterprise
    	// edition running on W10
    	#endif
    #elif PROFESSIONAL
    // do something else
    #else
    // code for the leaner version
    #endif
    

    #ifと#elifは、限られた論理オペレータもサポートしています.使用できます!、=,!=など.
    タグが存在する場合はtrueとみなされ、定義がなければfalseとみなされるため、このように使用することもできます.
    #if W10 && (ENTERPRISE==false) // if W10 is defined but ENTERPRISE isn't

     
    #warningと#error
    コンパイラが#warningに遭遇すると、警告メッセージが生成されます.
    コンパイラがerrorに遭遇すると、エラーメッセージが発生します.
        class Program
        {
            static void Main(string[] args)
            {
    
    #warning this is a warning message which will be shown when compile
    
                Console.WriteLine("Hello World!");
    
    #error this is a error message, and will break build
            }
        }
    

    コンパイル結果:
    Program.cs(10,10): warning CS1030: #warning: 'this is a warning message which will be shown when compile' [/define_warning/define_warning.csproj]
    Program.cs(14,8): error CS1029: #error: 'this is a error message, and will break build' [/define_warning/define_warning.csproj]
        1 Warning(s)
        1 Error(s)
    

    これらのコマンドを使用して、#define文が間違っているかどうかを確認し、#warningを使用して何かをするように注意することができます.
    #if DEBUG && RELEASE
    #error "You've defined DEBUG and RELEASE simultaneously!"
    #endif
    #warning "Don't forget to remove this line before the boss tests the code!"
    Console.WriteLine("*I love this job.*");
    

      
    #regionと#endregion
    コードを識別するために使用することができ、Visual Studioや他の識別可能なIDEで役立ちます.
    #region Member Field Declarations
    int x;
    double d;
    Currency balance;
    #endregion
    

      
    #line
    #lineコマンドは、コンパイラが警告およびエラーを出力したときの対応するファイル名および行番号情報を変更するために使用できます.これは実際には、使うことが少ないかもしれません.
    主にサードパーティ製パッケージを使用する場合、コンパイラがレポートする行番号やファイル名が実際に一致しない場合があります.
    #lineは、このマッチングを復元するために使用することができる.
    #line 164 "Core.cs" // We happen to know this is line 164 in the file Core.cs, 
    // before the intermediate package mangles it.
    // later on
    #line default // restores default line numbering
    

      
    #pragma
    #pragmaコマンドは、コンパイラ警告に指定された番号を終了または復元するために使用できます.
    コマンドラインオプションとは異なり、#pragmaコマンドはクラスまたはメソッドレベルで実装できます.
    例:
        class Program
        {
            static void Main(string[] args)
            {
                int i = 0;
                Console.WriteLine("Hello World!");
            }
        }
    

    コンパイルにはwarningがあります.
    Program.cs(9,17): warning CS0219: The variable 'i' is assigned but its value is never used [/define_warning/define_warning.csproj]
        1 Warning(s)
        0 Error(s)  

    warning情報からwarning CS 0219であることがわかり、#pragmaに加入するとwarningはありません.
    #pragma warning disable CS0219
        public class Program
        {
            static void Main(string[] args)
            {
                int i = 0;
                Console.WriteLine("Hello World!");
            }
        }
    #pragma warning restore CS0219
    

    注意:warningのコードは大文字と小文字を区別し、CS 2019は大文字で、cs 2019と書けば役に立たない. 
     
    学習資料
    C#高度プログラミング(第11版)C#7&.NET Core 2.0(.NET開発経典名著)