我已经看到了实例化委托对象的不同形式。例如:
我有以下代理和方法。
public delegate void Delegate();
public void foo();
这两个实例化选项。
Delegate del = new Delegate(foo);
Delegate del = foo;
我的问题如下:这两个陈述之间的语义差异是什么?
答案 0 :(得分:2)
简短的回答是没有。
答案很长,他们都编译成同一个IL。
Delegate del1 = foo;
Delegate del2 = new Delegate(foo);
编译到
IL_0001: ldarg.0
IL_0002: ldftn UserQuery.foo
IL_0008: newobj UserQuery+Delegate..ctor
IL_000D: stloc.0 // del1
IL_000E: ldarg.0
IL_000F: ldftn UserQuery.foo
IL_0015: newobj UserQuery+Delegate..ctor
IL_001A: stloc.1 // del2
答案 1 :(得分:2)
绝对没有。编译器会将第二个实例转换为Delegate
的实例化,就像第一个实例一样:
// Delegate del = new Delegate(foo);
ldftn void App.Program::foo()
newobj instance void App.Program/Delegate::.ctor(object, native int)
stloc.0
// Delegate de2l = foo;
ldftn void App.Program::foo()
newobj instance void App.Program/Delegate::.ctor(object, native int)
stloc.1
答案 2 :(得分:1)
我不知道。编译器将为您生成新的。 类似的问题是answered here。这种快捷方法是从C#2.0开始引入的 - MSDN。