c# – nameof和typeof之间的区别

c# – nameof和typeof之间的区别,第1张

概述纠正我,如果我错了,但做某事 var typeOfName = typeof(Foo).Name; 和 var nameOfName = nameof(Foo); 应该给你完全一样的输出.根据这个来源,可以理解的一个原因是:https://msdn.microsoft.com/en-us/library/dn986596.aspx是这样的 “Using nameof helps keep your 纠正我,如果我错了,但做某事
var typeOfname = typeof(Foo).name;

var nameOfname = nameof(Foo);

应该给你完全一样的输出.根据这个来源,可以理解的一个原因是:https://msdn.microsoft.com/en-us/library/dn986596.aspx是这样的

“Using nameof helps keep your code valID when renaming deFinitions”

如果要将类实例作为字符串获取,则不可能做到这样:

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:
取自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.0IL_0007: ldstr "firstname"IL_000c: stloc.1IL_000d: ldloc.1IL_000e: call voID [mscorlib]System.Console::Writeline(string)
解决方法 两个原因:

nameof变成编译时常数. typeof(…).名称需要一点反思.这不算太贵,但在某些情况下可能会受到伤害.

其次,它用于其他类型的名称.例如,参数:

voID SomeMethod(int myArgument){  DeBUG.Writeline(nameof(myArgument));}

您也可以获得课堂成员甚至当地人的姓名.不用说,这对调试信息非常有用.这也是实现较不脆弱反射的方法之一.解析表达式的树(可悲的是,在我使用这个的项目中,我们仍然坚持使用C#5的.NET 4.0 – 它会在这里保存我的几个黑客).

为了清除一些混乱,nameof不是一个功能,也不是typeof.它是一个编译时 *** 作符,它总是在编译时进行评估(尽管显然,泛型可以及时地将“编译时”移动一点).

总结

以上是内存溢出为你收集整理的c# – nameof和typeof之间的区别全部内容,希望文章能够帮你解决c# – nameof和typeof之间的区别所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1260424.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存