本文へスキップ
BecomeCoder

C#文法コース · 第9章 文法をさらに使いこなす · レッスン61

nameof と typeof

ブラウザで完結

導入

エラーメッセージに変数名を埋め込むとき、"count が不正です" と手書きすると、後で変数名を変えたときに文字列が置き去りになります。nameof は変数やメンバーの名前を、typeof は型そのものの情報を、コードから安全に取り出します。

説明

flowchart LR
    N["nameof(count)"] --> S[""count"(名前が文字列に)"]
    T["typeof(int)"] --> Y["System.Int32(型の情報)"]
    style N fill:#e1f5fe
    style T fill:#fff3e0

nameof は変数名の変更に自動で追従します(リネームすれば文字列も変わる)。typeof は型の名前・名前空間などを持つ Type を返します。

サンプル

int count = 5;

Console.WriteLine(nameof(count));       // count(変数名がそのまま文字列に)
Console.WriteLine(typeof(int).Name);    // Int32
Console.WriteLine(typeof(string));      // System.String

// 引数チェックの定番。文字列を手書きしないので安全
void Register(string? name)
{
    if (name is null)
        throw new ArgumentNullException(nameof(name));   // "name"
}
  • nameof(x)x の名前をコンパイル時に文字列化する(実行時コストなし)
  • 変数をリネームすると nameof の結果も自動で変わる(ズレない)
  • typeof(T) は型の Type を返し、.Name.FullName で名前を取れる

やってみよう

nameof にメソッド名やプロパティ名を渡すとどうなるか、typeofdouble や自作クラスを渡すと何が出るかを試してみましょう。

演習

double price = 100.0;

// TODO: nameof を使って変数 price の名前を出力してください
Console.WriteLine(___);   // price
  • 期待される出力: price
ヒント1を見る

nameof(price) と書きます

ヒント2を見る

nameof はクォートで囲みません。変数をそのまま渡します

まとめ

  • nameof は名前を安全に文字列化する(リネームに強い)
  • typeof は型情報(Type)を取り出す
  • 例外メッセージや引数チェックで手書き文字列を減らせる

次回: 値をまとめて受け取る「分割代入(Deconstruct)」です。

実際に動かしてみよう

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

C# — ブラウザ内で実行

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