এটি সত্যই কার্যকর 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"
এটি আসলে তুলনামূলকভাবে ধীর। নেট নেট এনাম মান (অর্থাত্ 7) ধরে রাখে এবং রান সময় নামটি খুঁজে পায়।
পরিবর্তে ব্যবহার করুন nameof:
Console.WriteLine(nameof(MyEnum.FooBar))
> "FooBar"
এখন। নেট কম্পাইল করার সময় এনামের নামটি স্ট্রিংয়ের সাথে প্রতিস্থাপন করে।
তবুও আরেকটি ব্যবহার হ'ল 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....");
}