導入
エラーメッセージに変数名を埋め込むとき、"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 にメソッド名やプロパティ名を渡すとどうなるか、typeof に double や自作クラスを渡すと何が出るかを試してみましょう。
演習
double price = 100.0;
// TODO: nameof を使って変数 price の名前を出力してください
Console.WriteLine(___); // price
- 期待される出力:
price
ヒント1を見る
nameof(price) と書きます
ヒント2を見る
nameof はクォートで囲みません。変数をそのまま渡します
まとめ
nameofは名前を安全に文字列化する(リネームに強い)typeofは型情報(Type)を取り出す- 例外メッセージや引数チェックで手書き文字列を減らせる
次回: 値をまとめて受け取る「分割代入(Deconstruct)」です。