You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CallerMemberName等属性对应用性能的影响及实现机制问询

CallerMemberName、CallerFilePath、CallerLineNumber 属性的性能影响与实现机制

性能影响

  • 几乎无运行时性能损耗:这些属性的值是编译阶段就确定的常量,调用时直接传递字面量参数,和手动传入字符串、数字的性能完全一致
  • 远优于反射实现:对比通过反射获取调用方信息的方式,这类属性不需要在运行时动态扫描程序集、解析类型元数据,完全没有反射带来的性能开销
  • 热点路径友好:即使在高频调用的代码段中使用,也不会成为性能瓶颈,本质只是传递几个简单的常量值

实现机制

  • 编译阶段处理:.NET编译器(如Roslyn)在编译代码时,会自动分析调用方的上下文信息,将成员名、源文件路径、行号作为常量参数填充到调用指令中
  • 与反射无关:完全不依赖反射API,所有信息都在编译时固化到IL代码里,运行时无需额外计算
  • 示例代码的编译结果:你写的TraceMessage("Something happened."),编译器会自动生成类似如下的调用代码:
    TraceMessage("Something happened.", "DoProcessing", "你的源文件完整路径", 4);
    

你的示例代码

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

内容的提问来源于stack exchange,提问作者Juha Syrjälä

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:42:56