Jest naprawdę przydatny ArgumentException
i jego pochodne:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Teraz, jeśli ktoś input
zmieni nazwę parametru, wyjątek również będzie aktualizowany.
Jest także przydatny w niektórych miejscach, w których wcześniej trzeba było zastosować odbicie, aby uzyskać nazwy właściwości lub parametrów.
W twoim przykładzie nameof(T)
dostaje nazwę parametru typu - może to być również przydatne:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Innym zastosowaniem nameof
jest wyliczanie - zwykle jeśli chcesz, aby nazwa ciągu wyliczenia była używana .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
Jest to faktycznie stosunkowo wolne, ponieważ .Net przechowuje wartość wyliczania (tj. 7
) I znajduje nazwę w czasie wykonywania.
Zamiast tego użyj nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Teraz .Net zastępuje nazwę wyliczenia ciągiem w czasie kompilacji.
Jeszcze inne zastosowanie to takie jak INotifyPropertyChanged
logowanie i logowanie - w obu przypadkach chcesz, aby nazwa członka, do którego dzwonisz, została przekazana do innej metody:
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
Lub...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}