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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:01:15