从TypeBuilder获取已定义MethodBuilder:行为是否受规范保障?
关于TypeBuilder.DefineMethod重复调用返回同一实例的疑问
代码示例
var methodBuilder1 = typeBuilder.DefineMethod("GetMedalIds", MethodAttributes.Public | MethodAttributes.HideBySig, CallingConventions.HasThis, typeof(int[]), null); var methodBuilder2 = typeBuilder.DefineMethod("GetMedalIds", MethodAttributes.Public | MethodAttributes.HideBySig, CallingConventions.HasThis, typeof(int[]), null);
现象与推测
两次调用DefineMethod的参数完全一致,且使用同一个typeBuilder实例,测试发现methodBuilder1与methodBuilder2指向同一实例(methodBuilder1 == methodBuilder2始终成立),由此推测:TypeBuilder会在方法未定义时创建MethodBuilder,已定义时返回已存在的实例。
疑问
DefineMethod的注释未提及该行为,此行为是否受C#规范的绝对保障,还是仅为可能变更的实现细节?
解答
这个行为不属于C#语言规范的强制要求,它是.NET运行时(如CoreCLR)中TypeBuilder的具体实现细节,而非被官方文档或规范明确保障的行为。
- 官方文档(包括
DefineMethod的XML注释)并未明确说明重复调用会返回已存在的实例,这意味着该行为没有契约级别的承诺。 - 不同的.NET实现(如.NET Framework、.NET Core、Mono)可能存在差异,即使当前版本返回同一实例,未来版本也可能因内部逻辑调整而改变这一行为。
- 从设计角度看,
TypeBuilder的核心职责是构建类型,重复调用同名同参数的方法定义本身属于非典型场景,官方不会为这种未明确的使用场景提供稳定性保障。
如果你的代码依赖于这个行为,存在潜在的兼容性风险,建议避免依赖该实现细节,改为确保只调用一次DefineMethod来获取MethodBuilder实例。
内容的提问来源于stack exchange,提问作者Dantte
相关产品推荐
相关产品推荐

