導入
C/C++の「マクロ」に一番近いのが、C#のプリプロセッサディレクティブ(#で始まる命令)です。「コードの一部をコンパイル対象に含めるか」をコンパイル時に決めます。「デバッグ時だけのログ」などに使います。
図解
flowchart LR
SRC["#if DEBUG ... #endif"] --> PRE["コンパイル時に判定<br/>DEBUGは定義済み?"]
PRE -->|Yes| A["#if内を含めてコンパイル"]
PRE -->|No| B["#if内は丸ごと無視"]
サンプル
#define FEATURE_BETA
Console.WriteLine("通常の処理");
#if FEATURE_BETA
Console.WriteLine("ベータ機能: 有効");
#else
Console.WriteLine("ベータ機能: 無効");
#endif
#define シンボルで「シンボルの存在」を定義する(値は持たない)#if シンボル ... #endifで、定義されていればその範囲をコンパイルに含める- C/C++のマクロと違い値の置換はできない——定数が欲しいなら
constを使う - 実務で最頻出は
#if DEBUG(前レッスンのDebug構成でのみ有効なコード)。#regionは折りたたみ用の目印、#pragma warningは警告の一時抑制
演習
#define PREMIUM
Console.WriteLine("=== 商品一覧 ===");
// TODO: PREMIUM が定義されていれば "プレミアム限定商品" を、
// そうでなければ "通常商品のみ" を出力する #if/#else を書いてください
___
- 期待される出力:
=== 商品一覧 ===プレミアム限定商品(2行)
ヒント1を見る
#if PREMIUM … #else … #endif で分岐します
ヒント2を見る
#if PREMIUM\nConsole.WriteLine("プレミアム限定商品");\n#else\nConsole.WriteLine("通常商品のみ");\n#endif
まとめ
- C#の「マクロ」はプリプロセッサディレクティブ。値の置換はできず「含めるか消すか」の二択
#if DEBUGがビルド構成(Debug/Release)と連動する代表例#regionは目印、#pragma warningは警告抑制
次章: 運用の必須要素「ログ出力」へ進みます。