Ini sangat berguna untuk ArgumentException
dan turunannya:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Sekarang jika seseorang refactor nama input
parameter, pengecualian akan selalu diperbarui.
Ini juga berguna di beberapa tempat di mana refleksi sebelumnya harus digunakan untuk mendapatkan nama properti atau parameter.
Dalam contoh Anda nameof(T)
mendapatkan nama parameter tipe - ini dapat berguna juga:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Penggunaan lain nameof
adalah untuk enum - biasanya jika Anda ingin nama string enum yang Anda gunakan .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
Ini sebenarnya relatif lambat karena .Net memegang nilai enum (yaitu 7
) dan menemukan nama pada saat run time.
Alih-alih gunakan nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Sekarang .Net menggantikan nama enum dengan string pada waktu kompilasi.
Namun kegunaan lain adalah untuk hal-hal seperti INotifyPropertyChanged
dan masuk - dalam kedua kasus Anda ingin nama anggota yang Anda panggil diteruskan ke metode lain:
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
Atau...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}