.NET開発で#ifを使わず実行コードを切り替える方法

この記事は公開から3年以上経過しています。

.NET開発でDebugビルドの場合のみ実行されるコードなどを#ifプリプロセッサディレクティブを使わずに実現する方法。

.NET開発者にとっては当たり前だと思いますが、昔ながらのC/C++開発者の知識の引き出しが増やせるかもしれません。

対応方法

クラスやメソッドの定義に.NETのConditional属性を設定する。

サンプルソースコード

以下の例では、DEBUGシンボルが未定義の場合はRunOnlyInDebugBuild()メソッドの呼び出しがコードへコンパイルされなくなります。

Conditional属性メソッドの呼び出しは行われませんが、実装はコードにコンパイルされること、およびVB.NETのAddressOf演算子によるメソッド呼び出しではこの属性を利用できないことに注意が必要です。詳しくは参考ウェブサイトのリンクをご参照ください。

C#

using System;

namespace cstest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            RunOnlyInDebugBuild();
            Console.ReadKey();
        }

        [System.Diagnostics.Conditional("DEBUG")]
        private static void RunOnlyInDebugBuild()
        {
            Console.WriteLine("Called on debug mode");
        }
    }
}

VB.NET

Module Module1

    Sub Main()
        RunOnlyInDebugBuild()
        Console.ReadKey()
    End Sub

    <System.Diagnostics.Conditional("DEBUG")>
    Sub RunOnlyInDebugBuild()
        Console.WriteLine("Called on debug mode")
    End Sub

End Module

ちなみに上記C#のコードをReleaseビルドした時に生成されるILコードは以下のとおり。
Conditional(""DEBUG)属性が設定されたメソッドの呼び出しが行われない&メソッド実装が残っていることを確認できます。

file

両者は特性が異なるため、用途や目的に応じて#ifディレクティブとConditional属性をうまく使い分けて利用することをオススメします。

参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする