【问题标题】:MethodBase.GetCurrentMethod().Name vs [CallerMemberName]MethodBase.GetCurrentMethod().Name 与 [CallerMemberName]
【发布时间】:2013-07-11 15:41:49
【问题描述】:

有什么区别以及对代码的影响?

关于性能和限制,什么更适合?

新属性:
- [调用者文件路径属性]
- [CallerMemberName]
- [来电号码]

今天它们也可以在 .NET 4 中使用(它易于开发并且看起来很神奇)。它们的值是在运行时编译或解析的?

【问题讨论】:

  • 你需要用它们做什么?如果它们用于在异常期间报告堆栈跟踪信息,则性能应该有些无关紧要。如果您使用它们来检测整个应用程序,那就完全是另一回事了。
  • 它们被编译在:"Caller Info values are emitted as literals into the Intermediate Language (IL) at compile time." 编辑:性能方面,我从未对它们进行基准测试或大量使用它们,但我怀疑它应该相当小,因为大部分工作都是在编译时间。 (虽然不确定性能关键或超级频繁命中的代码)使用基于反射的方法(如StackTraceMethodBase.GetCurrentMethod())可能容易受到方法内联或混淆的影响。

标签: c# .net reflection compiler-services


【解决方案1】:

一方面,MethodBase.GetCurrentMethod() 返回当前方法,而您可以使用[CallerMemberName] 等将有关调用方法的一些信息传递到当前方法。

前者在运行时使用反射进行评估,因此相对较慢,而后者在编译时处理,基本上是无操作性能。我实际上已经在测试中验证了这一点。每次反射将花费您大约 20 微秒的时间,如果经常调用,这可能会非常重要,而 [Caller...] 属性不会产生可衡量的损失。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2020-07-11
    • 2012-08-30
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多