c#delegates没有参数或返回类型

时间:2016-03-13 01:13:28

标签: c# delegates

我无法在网上找到这类代码的解释:

somebutton.Click += delegate
{
    somecode;
}

何时以及如何使用此功能?这叫什么? MSDN给我的印象是委托应该总是有一个返回类型和一组参数,但是这段代码表明你可以添加纯表达式。

此外," + ="这意味着什么我知道如果它是一个字符串或一个数字意味着什么,但你如何"添加"代表?这就像在事件处理程序代码的内部和底部添加额外的表达式一样吗?或者加法意味着什么?

Thnx提前。

1 个答案:

答案 0 :(得分:3)

在此上下文中,关键字delegate不用于定义委托类型,而是用于表示匿名方法

您可能已经知道,Button.Click被称为event。对于事件,您可以向其添加事件处理程序,以便在事件发生时收到通知。在这种情况下,单击按钮时会收到通知。

提出了一个问题,"如何为事件添加事件处理程序?"这非常简单,您只需要一个满足所需方法签名的方法即可。您看,因为Button.Click被定义为类型EventHandler的事件,所以需要以下方法签名来处理该事件:

void MethodName (object sender, EventArgs e)

通常,您可以编写类似这样的方法:

private void ButtonIsClicked(object sender, EventArgs e) {
    Console.WriteLine("Hello");
]

并将其添加到活动中:

someButton.Click += ButtonIsClicked;

因此,要回答您的问题,+=运算符是为事件添加事件处理程序。

但是你说,等等,我的代码片段不包含这样的方法签名,为什么它有效?

有时人们很懒,或者他们认为为一个简单的功能编写一个全新的方法太冗长了。因此,他们使用匿名方法使代码更简洁。 (虽然不像lambdas那样简洁)

现在让我们看一下匿名方法的语法:

delegate {/* Method body goes here */}

但是,缺少签名。那是对的。因为匿名方法应该使您的代码简洁,以节省编写整个方法签名的工作量。

编译器在编译时推断出匿名方法的方法签名。这就是它的想法:

  

啊,一个匿名的方法!让我看看......显然这个人想要将此方法添加到Button.Click,因此方法签名必须与EventHandler的签名相同。我将匿名方法更改为实际方法,并将其添加到事件中。

编辑:

我提到了lambda表达式。我想我应该详细说明,因为它使代码甚至更多简洁!

假设您的代码使用匿名方法:

someButton.Click += delegate {
    Console.WriteLine("Hello");
}

您可以将其转换为lambda表达式:

someButton.Click += (sender, e) => Console.WriteLine("Hello");

IMO,这是一个匿名方法更简洁。请注意,lambda表达式中不能省略(sender, e)。它指定参数列表。此外,当您想要编写一个非常长的方法时,建议不要使用lambda表达式。

编辑:

  

如果我在另一个之后添加两个匿名方法会发生什么...最后一个会覆盖第一个吗?

让我们看看这个:

someButton.Click += delegate { Console.WriteLine("Hi 1"); }
someButton.Click += delegate { Console.WriteLine("Hi 2"); }

当您单击按钮时,打印出Hi 1,然后打印出Hi 2。这意味着当您向事件添加多个事件处理程序时,将按照添加的顺序调用它们。

此外,我想向您展示使用匿名方法的另一个示例。匿名方法不仅可以用于添加事件处理程序,还可以用于传递委托类型参数。

我们想要调用此方法:

public static void SomeMethod(Action a) {...}

你可以通常的方式做到:

public void MyAction () {
    Console.WriteLine("Hello");
}
// in some other method...
SomeMethod(MyAction);

或者您可以使用匿名方法

SomeMethod(delegate {Console.WriteLine("Hello");});

或者您甚至可以使用lambda表达式

SomeMethod(() => Console.WriteLine("Hello"));