Поправьте меня, если я ошибаюсь, но делаю что-то вроде
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
. Использует ли он отражение?
Обновление 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)
nameof(fooInstance)
возвращает"fooInstance"
. Сnameof
вы получаете имя переменной, а не имя типа. - person Gentian Kasa   schedule 11.11.2015static string GetName<T>(T item)
делает что-то совершенно отличное отtypeof
илиnameof
. Он возвращает имя случайного свойства, которое имеет тип. Он также может вызвать исключение, если он используется не так, как предполагалось. - person Dennis_E   schedule 11.11.2015nameof
, чем добавлять свой собственный метод с анонимными типами. - person DavidG   schedule 11.11.2015nameof
иtypeof
не являются функциями - person Ivan Stoev   schedule 11.11.2015