Es ist wirklich nützlich für ArgumentException
und seine Derivate:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Wenn nun jemand den Namen des input
Parameters umgestaltet, wird auch die Ausnahme auf dem neuesten Stand gehalten.
Es ist auch an einigen Stellen nützlich, an denen zuvor Reflexionen verwendet werden mussten, um die Namen von Eigenschaften oder Parametern zu erhalten.
In Ihrem Beispiel nameof(T)
wird der Name des Typparameters abgerufen - dies kann auch nützlich sein:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Eine andere Verwendung von nameof
ist für Aufzählungen - normalerweise, wenn Sie den Zeichenfolgennamen einer Aufzählung möchten, die Sie verwenden .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
Dies ist tatsächlich relativ langsam, da .Net den Aufzählungswert (dh 7
) enthält und den Namen zur Laufzeit findet.
Verwenden Sie stattdessen nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Jetzt ersetzt .Net den Namen der Aufzählung zur Kompilierungszeit durch eine Zeichenfolge.
Eine weitere Verwendung ist das INotifyPropertyChanged
Protokollieren. In beiden Fällen möchten Sie, dass der Name des aufgerufenen Mitglieds an eine andere Methode übergeben wird:
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
Oder...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}