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ä
相关产品推荐
相关产品推荐

