यह वास्तव में ArgumentExceptionऔर इसके डेरिवेटिव के लिए उपयोगी है :
public string DoSomething(string input)
{
if(input == null)
{
throw new ArgumentNullException(nameof(input));
}
...
अब यदि कोई inputपैरामीटर के नाम को रिफ्लेक्टर करता है तो अपवाद को भी अद्यतित रखा जाएगा।
यह कुछ स्थानों पर भी उपयोगी है जहां पहले प्रतिबिंब का उपयोग गुणों या मापदंडों के नाम प्राप्त करने के लिए किया जाना था।
आपके उदाहरण nameof(T)में टाइप पैरामीटर का नाम मिलता है - यह उपयोगी भी हो सकता है:
throw new ArgumentException(nameof(T), $"Type {typeof(T)} does not support this method.");
nameofएनम का एक और उपयोग है - आमतौर पर यदि आप एक एनुम का स्ट्रिंग नाम चाहते हैं जो आप उपयोग करते हैं .ToString():
enum MyEnum { ... FooBar = 7 ... }
Console.WriteLine(MyEnum.FooBar.ToString());
> "FooBar"
यह वास्तव में .net के रूप में अपेक्षाकृत धीमी गति से चलता है। एनम मान (यानी 7) रखता है और रन टाइम पर नाम पाता है।
इसके बजाय उपयोग करें nameof:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
अब .Net संकलन समय पर एक स्ट्रिंग के साथ एनम नाम की जगह लेता है।
फिर भी एक और उपयोग चीजों 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....");
}