如果我错了,请纠正我,但是做类似的事情
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)