C#で開発環境やテスト用のコードをデバッグ(Debug)時のみ実行して、通常時には実行されないような処理の書き方について紹介させていただきます。デバッグ時のみ実行する方法は、Conditional属性を使う方法と、プリプロセッサディレクティブを使う方法がありますが、前者は使える場面が限られてくるため、後者の方法を解説していきます。
プリプロセッサディレクティブを使った書き方
public void DemoMethod()
{
// 何らかの処理
#if DEBUG
Console.WriteLine("デバッグ時に実行する処理");
#else
Console.WriteLine("デバッグ以外で実行する処理");
#endif
// 何らかの処理
}
仕組みとしては、条件付きコンパイルの制御(#if ~ #else ~ #endif)を使用して、DEBUGシンボルが定義されているかどうかで、C#コンパイラにコンパイルさせる処理を変更します。(Visual Studioの初期設定では、Debug構成でビルド/実行するとDEBUGシンボルが自動的に定義されます。)
- #if DEBUG
DEBUGシンボルが定義されている場合のみコンパイルされる。 - #else
#if で指定した条件を満たさない場合のみコンパイルされる。デバッグ時のみに何か処理をしたい場合には #if のみを書いて #else は省略できる。 - #endif
条件付きコンパイルを閉じる。
上記の例のような処理の間だけでなく、#if ~ #endifでメソッド自体を囲んだりクラス全体を囲むことでメソッドやクラス全体をデバッグ実行時のみ実行されるように指定することも可能です。
より実用的な書き方
internal static class BuildState
{
// デバッグ実行かどうか
public static bool IsDebug =>
#if DEBUG
true;
#else
false;
#endif
}
// ~~~~~~~~~~~~~~~~~~~~
public void DemoMethod()
{
// 何らかの処理
if(BuildState.IsDebug)
{
Console.WriteLine("デバッグ時に実行する処理");
}
else
{
Console.WriteLine("デバッグ以外で実行する処理");
}
// 何らかの処理
}
プリプロセッサディレクティブは、何度も書くのが面倒で見にくくなってしまううえ、コンパイルされない側のコードがVisual Studioで認識されなくなるので、大変不便です。そこで、上記のようにプリプロセッサディレクティブを1つのクラス(BuildState)にまとめます。そうすると、使用する際は通常のif文として使用できます。(通常のif文なので当然Visual Studioにも認識されます。)
ただし、この場合、メソッドやクラスを囲むような使い方はできませんので、メソッドやクラスを囲む場合はプリプロセッサディレクティブを直接書いて対応してください。
まとめ
今回は、C#でデバッグ実行時のみ実行する処理の書き方を解説させていただきました。開発時やテストで使用するデバッグ用コードはしっかりと切り分けておかないとバグの原因にもなりかねません。今回紹介した方法で、デバッグ実行時のみ動作するように切り分けて対応しておきましょう。
\ おすすめ書籍 /