Поправьте меня, если я не прав, но делать что-то вродеразница между nameof и TypeOf
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
. Использует ли он отражение?
Update 1: Взятые из here
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' вы получаете имя переменной, а не имя типа. –
получает строковую версию переменной. nameof (aaa) вернет «aaa» –
'static string GetName (T item)' делает что-то совершенно иное, чем 'typeof' или' nameof'. Он возвращает имя случайного свойства, которое имеет тип. Это может также вызвать исключение, если оно используется по-другому, чем предполагалось. –