มันมีประโยชน์จริงๆArgumentException
และอนุพันธ์:
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
ตอนนี้ถ้ามีคน refactors ชื่อของ input
พารามิเตอร์ข้อยกเว้นจะถูกปรับปรุงให้ทันสมัยเกินไป
นอกจากนี้ยังมีประโยชน์ในบางสถานที่ซึ่งต้องใช้การสะท้อนก่อนหน้านี้เพื่อรับชื่อคุณสมบัติหรือพารามิเตอร์
ในตัวอย่างของคุณnameof(T)
ได้รับชื่อของพารามิเตอร์ประเภท - นี้จะมีประโยชน์เช่นกัน:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
การใช้งานอื่นnameof
สำหรับ enums - โดยปกติถ้าคุณต้องการชื่อสตริงของ enum ที่คุณใช้.ToString()
:
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
ซึ่งค่อนข้างช้าเนื่องจาก. Net ถือค่า enum (เช่น7
) และค้นหาชื่อ ณ เวลารันไทม์
ใช้แทนnameof
:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
ตอนนี้. Net แทนที่ชื่อ enum ด้วยสตริงในเวลารวบรวม
การใช้งานอื่นมีไว้สำหรับสิ่งที่ชอบINotifyPropertyChanged
และการเข้าสู่ระบบ - ในทั้งสองกรณีคุณต้องการชื่อของสมาชิกที่คุณกำลังจะถูกส่งไปยังวิธีอื่น
// Property with notify of change
public int Foo
{
get { return this.foo; }
set
{
this.foo = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(this.Foo));
}
}
หรือ...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}