for WPF developers
Home Profile Tips 全記事一覧

#if~#endif が向かない例

(2016/12/03 0:25:54 created.)

#if~#endif で囲むと、#if で指定したプリプロセスのシンボルが存在するかどうかで、囲まれた部分のプログラムをコンパイルするかどうかをスイッチングすることができます。例えば次のようなコードを見てみましょう。

Program.cs
  1. namespace Tips_ConditionalAttribute
  2. {
  3.     using System;
  4.  
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             var model = new Sample();
  10.  
  11. #if DEBUG
  12.             model.DebugOutput();
  13. #endif
  14.  
  15.             Console.ReadKey();
  16.         }
  17.     }
  18.  
  19.     public class Sample
  20.     {
  21. #if DEBUG
  22.         public void DebugOutput()
  23.         {
  24.             Console.WriteLine("シンボル \"DEBUG\" が定義されているときのみ実行されます。");
  25.         }
  26. #endif
  27.     }
  28. }

#if で DEBUG というシンボルを指定しているため、このシンボルが定義されているときだけ DebugOutput() メソッドがコンパイルされることになります。つまり、シンボル DEBUG が定義されていないときは DebugOutput() メソッドが存在しないことになるため、このメソッドを呼び出す部分にも同様に #if~#endif を書かないと、シンボル DEBUG が定義されていない構成でコンパイルしたときにコンパイルエラーとなってしまいます。

このようなケースでは、#if~#endif を両方に書かなくてはならなくなり、コードが煩雑になります。こういった場合は #if~#endif ではなく、Conditional 属性を使用したほうがコードがわかりやすく、ミスが発生する可能性も低くなります。