Nó thực sự hữu ích cho ArgumentException
và các dẫn xuất của nó:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
Bây giờ nếu ai đó tái cấu trúc tên của input
tham số, ngoại lệ cũng sẽ được cập nhật.
Nó cũng hữu ích ở một số nơi mà sự phản chiếu trước đây phải được sử dụng để có được tên của các thuộc tính hoặc tham số.
Trong ví dụ của bạn nameof(T)
có tên của tham số loại - điều này cũng có thể hữu ích:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
Một cách sử dụng khác nameof
là cho enum - thông thường nếu bạn muốn tên chuỗi của enum bạn sử dụng .ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
Điều này thực sự tương đối chậm vì .Net giữ giá trị enum (nghĩa là 7
) và tìm thấy tên trong thời gian chạy.
Thay vào đó sử dụng nameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
Bây giờ .Net thay thế tên enum bằng một chuỗi tại thời gian biên dịch.
Tuy nhiên, một cách sử dụng khác là dành cho những thứ như INotifyPropertyChanged
và đăng nhập - trong cả hai trường hợp bạn muốn tên của thành viên mà bạn đang gọi sẽ được chuyển sang phương thức khác:
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
Hoặc là...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}