Це дійсно корисно для ArgumentException
та його похідних:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Тепер, якщо хтось переробляє ім'я input
параметра, виняток також буде оновлений.
Це також корисно в деяких місцях, де раніше потрібно було використовувати відображення для отримання назв властивостей або параметрів.
У вашому прикладі nameof(T)
отримується назва параметра типу - це також може бути корисно:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Ще одне використання nameof
- для перерахунків - зазвичай, якщо ви хочете, щоб ім'я рядка enum ви використовували .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
Це насправді відносно повільно, оскільки .Net утримує значення enum (тобто 7
) і знаходить ім'я під час виконання.
Замість цього використовуйте nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Тепер .Net замінює ім'я enum рядком під час компіляції.
Ще одне використання стосується таких речей, як INotifyPropertyChanged
реєстрація та реєстрація - в обох випадках ви хочете, щоб ім’я члена, якого ви телефонуєте, було передано іншому методу:
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
Або ...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}