5

可能重复:
为什么使用“new DelegateType(Delegate)”?
new Thread(void Target()) 和 new Thread(new ThreadStart(void Target())) 有什么区别?

所以我经历了一点委托,并以某种方式得到了整个想法。现在,我到处都能看到这样的例子:

public delegate void Deleg();
Deleg deleg = new Deleg(FunctionName);

deleg();

我认为这会创建一个委托对象,其函数指向作为参数传递给构造函数。

现在,我也可以这样做:

public delegate void Deleg();
public Deleg deleg;  

deleg = FunctionName;
deleg();

这似乎只创建一个引用,并传递函数的地址。它的工作原理是一样的,并且具有所有的委托功能。

但是现在,不管我在第二个例子中多写了一行,由于第一个在教程中更受欢迎,我真的会从第二个中失去或获得一些东西吗?

4

3 回答 3

5

好处是打字少了一点。编译器现在比最初更聪明,所以它可以隐式地进行方法组转换,这就是你不必new Deleg(FunctionName)再做的原因。

于 2013-01-05T20:09:38.377 回答
0

如果您在同一行添加分配(就像您在第一个示例中所做的那样),那么您键入的代码量大致相同。

public delegate void Deleg();
public Deleg deleg = FunctionName;
deleg();
于 2013-01-05T20:13:24.357 回答
0

其次是委托推断。

该方法的顺序和类型是否与委托的输入参数列表匹配?

  • -> 推断委托,因为方法签名与委托的签名匹配。

  • -> 委托和方法输入参数不匹配。不可能进行委托类型推断。

使用委托类型推断会丢失一些东西吗?没有。这是同一件事,我认为这是更可取的:更少冗长的代码,它提高了可读性。

此外,委托类型推断为您添加了另一个选项:

public delegate void Do();

Do some = () =>
{
   // Do stuff
};

或者

public delegate void Do(string a, string b);

// C# compiler infers the delegate from the lambda/anonymous method signature and it infers the type of the whole parameters too!
Do some = (a, b) =>
{
   // Do stuff
}
于 2013-01-05T20:13:52.517 回答