.NET中两种委托赋值写法new AddDelegate(Add)与直接赋值Add的区别是什么
结论先行
两种写法在运行时完全等价,没有任何功能、性能差异,第二种是C#推出的语法糖,编译器会自动帮你补全第一种的显式构造逻辑。
具体差异说明
- 第一种
AddDelegate addDelegate = new AddDelegate(Add);是C# 1.0原生支持的显式委托实例化写法,你手动完成了委托对象的创建、方法绑定全流程。 - 第二种
AddDelegate addDelegate = Add;是C# 2.0新增的方法组隐式转换语法特性,只要目标方法的签名、返回值和委托定义完全匹配,编译器会自动推断并生成和第一种写法完全一致的IL代码,你可以通过反编译工具(比如ILSpy)验证这一点。
适用场景区别
日常开发中优先选择更简洁的隐式转换写法即可,只有遇到编译器无法自动推断类型的特殊场景,才需要用显式构造写法:
- 存在多个方法重载,多个重载签名都能匹配当前委托定义,需要显式指定委托类型消除歧义
- 部分旧版本C#中,给Lambda表达式绑定委托时编译器无法自动推断类型,需要显式构造
举个需要显式构造的常见场景示例:
// 有两个重载的Add方法 int Add(int a, int b) => a + b; double Add(double a, double b) => a + b; // 直接隐式转换会报错,编译器不知道匹配哪个重载 // AddDelegate addDelegate = Add; // 显式构造就可以明确绑定签名匹配int参数的Add方法 AddDelegate addDelegate = new AddDelegate(Add);
内容的提问来源于stack exchange,提问作者nvionnddd9
相关产品推荐
相关产品推荐

