Это действительно полезно для 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));
}
}
Or...
// Write a log, audit or trace for the method called
void DoSomething(... params ...)
{
Log(nameof(DoSomething), "Message....");
}
person
Keith
schedule
29.07.2015
T
. Раньше был способ получить использованный шрифт. - person Jon Hanna   schedule 29.07.2015nameof
. Также помогает предотвратить опечатки. - person bvj   schedule 11.05.2017[Test, TestCaseSource(typeof(MyDataClass), "TestCases")]
, которую можно заменить на[Test, TestCaseSource(typeof(MyDataClass), nameof(MyDataClass.TestCases))]
. Намного приятнее. - person Jeremy   schedule 05.03.2018