É realmente útil para ArgumentException
e seus derivados:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Agora, se alguém refatorar o nome do input
parâmetro, a exceção também será mantida atualizada.
Também é útil em alguns lugares onde anteriormente era necessário usar a reflexão para obter os nomes de propriedades ou parâmetros.
No seu exemplo, nameof(T)
obtém o nome do parâmetro type - isso também pode ser útil:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Outro uso de nameof
é para enumerações - geralmente se você quiser o nome da string de uma enumeração, use .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
Na verdade, isso é relativamente lento, já que o .Net mantém o valor da enumeração (ie 7
) e encontra o nome no tempo de execução.
Em vez disso, use nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Agora .Net substitui o nome da enumeração por uma sequência em tempo de compilação.
Ainda outro uso é para coisas como INotifyPropertyChanged
e registro - nos dois casos, você deseja que o nome do membro que você está chamando seja passado para outro método:
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
Ou...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}