如果我错了请纠正我,但是做类似的事情
var typeOfName = typeof(Foo).Name;
and
var nameOfName = nameof(Foo);
应该给你完全相同的输出。根据该消息来源,可以理解的原因之一是:https://msdn.microsoft.com/en-us/library/dn986596.aspx https://msdn.microsoft.com/en-us/library/dn986596.aspx就是它
“使用 nameof 有助于在重命名定义时保持代码有效”
如果你想以字符串形式获取类实例,那就是not可以做这样的事情:
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
and nameof
)重构是可能的,所以我没有看到重新发明另一个更高级别关键字的任何其他原因,例如nameof
,执行已经存在的事情。它们之间是否存在我看不清楚的差异?
最后,如果有人能给我指出一个参考源来看看它的实现,我将不胜感激nameof
。它使用反射吗?
更新1:取自here https://stackoverflow.com/questions/26573102/is-nameof-evaluated-at-compile-time
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)