C#委托实例化语法

时间:2014-09-04 23:46:44

标签: c# delegates instantiation

我已经看到了实例化委托对象的不同形式。例如:

我有以下代理和方法。

public delegate void Delegate();
public void foo();

这两个实例化选项。

Delegate del = new Delegate(foo);
Delegate del = foo;

我的问题如下:这两个陈述之间的语义差异是什么?

3 个答案:

答案 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