nameof 式 (C# リファレンス)
nameof
式を使うと、変数、型、またはメンバーの名前が文字列定数として生成されます。 nameof
式はコンパイル時に評価され、実行時には影響を与えません。 オペランドが型または名前空間である場合、生成される名前は完全修飾ではありません。 nameof
式の使用例を次に示します。
Console.WriteLine(nameof(System.Collections.Generic)); // output: Generic
Console.WriteLine(nameof(List<int>)); // output: List
Console.WriteLine(nameof(List<int>.Count)); // output: Count
Console.WriteLine(nameof(List<int>.Add)); // output: Add
List<int> numbers = new List<int>() { 1, 2, 3 };
Console.WriteLine(nameof(numbers)); // output: numbers
Console.WriteLine(nameof(numbers.Count)); // output: Count
Console.WriteLine(nameof(numbers.Add)); // output: Add
nameof
式を使って、引数をチェックするコードの保守性を高めることができます。
public string Name
{
get => name;
set => name = value ?? throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null");
}
C# 11 以降では、メソッドまたはそのパラメーターの属性内にメソッド パラメーターを含む nameof
式を使用できます。 次のコードは、メソッド、ローカル関数、ラムダ式のパラメーターの属性に対してこれを行う方法を示しています。
[ParameterString(nameof(msg))]
public static void Method(string msg)
{
[ParameterString(nameof(T))]
void LocalFunction<T>(T param) { }
var lambdaExpression = ([ParameterString(nameof(aNumber))] int aNumber) => aNumber.ToString();
}
パラメーターを含む nameof
式は、null 許容分析属性または CallerArgumentExpression 属性を使用する場合に便利です。
オペランドが逐語的識別子である場合、次の例に示すように、@
文字は名前の一部ではありません。
var @new = 5;
Console.WriteLine(nameof(@new)); // output: new
C# 言語仕様
詳細については、C# 言語仕様の Nameof 式のセクションと、C# 11 - 拡張 nameof
スコープ機能の仕様を参照してください。
関連項目
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET