本文へスキップ
BecomeCoder

C#実践コース · 第3章 ビルド・ツールとプロジェクト基礎 · レッスン22

プリプロセッサディレクティブ ― C#の「マクロ」

ブラウザで完結

導入

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は警告抑制

次章: 運用の必須要素「ログ出力」へ進みます。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。