Исправьте меня, если я ошибаюсь, но делаю что-то вроде
var typeOfName = typeof(Foo).Name;
и
var nameOfName = nameof(Foo);
должен дать вам точно такой же результат. Одна из понятных причин в соответствии с этим источником: https://msdn.microsoft.com/en-us/library/dn986596.aspx заключается в том, что
"Использование nameof помогает сохранить код при переименовании определений"
Если вы хотите получить экземпляр класса как строку, то не можно сделать что-то вроде этого:
var fooInstance = new Foo();
var nameOfName = nameof(fooInstance);
однако вы можете сделать что-то вроде:
static string GetName<T>(T item) where T : class
{
return typeof(T).GetProperties()[0].Name;
}
var typeOfName2 = GetName(new { fooInstance });
В обоих случаях (typeof
и nameof
) рефакторинг возможен, поэтому я не вижу другой причины для повторного использования другого ключевого слова более высокого уровня, такого как nameof
, для выполнения чего-то, что уже существует. Есть ли различия между ними, которые я не вижу?
Наконец, я был бы признателен, если бы кто-то мог указать мне на источник ссылок, чтобы посмотреть на реализацию nameof
. Использует ли Reflection?
Обновление 1: Взято из здесь
nameof
, по-видимому, столь же эффективен, как и объявление строковой переменной. Никакого отражения или чего-либо еще!
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
Когда вы просматриваете созданный MSIL, вы увидите, что он эквивалентен объявлению строки, потому что ссылка на объект на строку попадает в стек с помощью оператора ldstr:
IL_0001: ldstr "Gigi"
IL_0006: stloc.0
IL_0007: ldstr "firstname"
IL_000c: stloc.1
IL_000d: ldloc.1
IL_000e: call void [mscorlib]System.Console::WriteLine(string)