与c#中的委托声明的差异

时间:2013-01-05 20:03:23

标签: c# delegates

  

可能重复:
  Why use “new DelegateType(Delegate)”?
  What is the difference between new Thread(void Target()) and 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();

这个似乎只创建一个引用,并传递函数的地址。这有效,并具有所有委托功能。

但是现在,无论我在第二个例子中还有一行,我实际上是否会因为第一个在教程中更受欢迎而失去或获得一些东西?

3 个答案:

答案 0 :(得分:5)

增益少一点打字。编译器现在比最初更聪明,因此它可以隐式执行方法组转换,这就是您不必再执行new Deleg(FunctionName)的原因。

答案 1 :(得分:0)

如果您在同一行添加作业(就像在第一行中那样),那么您键入的代码量大致相同。

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

答案 2 :(得分: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
}