È davvero utile per i ArgumentException
suoi derivati:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Ora, se qualcuno refactoring il nome del input
parametro, anche l'eccezione verrà mantenuta aggiornata.
È anche utile in alcuni luoghi in cui in precedenza si doveva usare la riflessione per ottenere i nomi di proprietà o parametri.
Nel tuo esempio nameof(T)
ottiene il nome del parametro type - anche questo può essere utile:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Un altro uso di nameof
è per enum - di solito se vuoi il nome di stringa di un enum che usi .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
Questo è in realtà relativamente lento in quanto .Net contiene il valore enum (cioè 7
) e trova il nome in fase di esecuzione.
Invece usa nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Ora .Net sostituisce il nome enum con una stringa in fase di compilazione.
Ancora un altro uso è per cose come INotifyPropertyChanged
e la registrazione - in entrambi i casi si desidera che il nome del membro che si sta chiamando venga passato a un altro metodo:
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
O...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}