我无法在网上找到这类代码的解释:
somebutton.Click += delegate
{
somecode;
}
何时以及如何使用此功能?这叫什么? MSDN给我的印象是委托应该总是有一个返回类型和一组参数,但是这段代码表明你可以添加纯表达式。
此外," + ="这意味着什么我知道如果它是一个字符串或一个数字意味着什么,但你如何"添加"代表?这就像在事件处理程序代码的内部和底部添加额外的表达式一样吗?或者加法意味着什么?
Thnx提前。
答案 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"));