Es realmente útil para ArgumentException
y sus derivados:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Ahora, si alguien refactoriza el nombre del input
parámetro, la excepción también se mantendrá actualizada.
También es útil en algunos lugares donde previamente se tuvo que usar la reflexión para obtener los nombres de propiedades o parámetros.
En su ejemplo, nameof(T)
obtiene el nombre del parámetro de tipo; esto también puede ser útil:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Otro uso de nameof
es para enumeraciones, generalmente si desea el nombre de cadena de una enumeración que utiliza .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
En realidad, esto es relativamente lento ya que .Net mantiene el valor de enumeración (es decir 7
) y encuentra el nombre en tiempo de ejecución.
En su lugar use nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Ahora .Net reemplaza el nombre de enumeración con una cadena en tiempo de compilación.
Sin embargo, otro uso es para cosas como el INotifyPropertyChanged
registro: en ambos casos, desea que el nombre del miembro que está llamando se pase a otro 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));
}
}
O...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}