为什么在向按钮添加事件时使用+ =?

时间:2016-05-27 00:48:44

标签: c# asp.net event-handling

我是ASP.NET的新手,我有一个关于在加载页面时向按钮(html服务器控件)添加事件处理程序的问题。

此代码位于C#:

protected void Page_Load(object sender, EventArgs e)
{
    Submit.ServerClick+=Submit_ServerClick;
}

在这里,我的问题是为什么我们需要添加+ =以及它的意义是什么?

5 个答案:

答案 0 :(得分:2)

+=将事件订阅委托添加到event。相反,-=event删除(取消订阅)事件委托。事件委托可以对单个委托进行多次分配,并且每个委托都将被执行(根据事件处理程序规范)。

如果你认为+=的sytnax与其他操作有关。

int x = 1 //x equals 1
x += 5; //x now equals 6

因此,当您添加订阅以使用相同的语法时,这是有道理的。

现在有多种不同的方式来订阅事件处理程序,但它们都以+=开头。 MSDN Reference

DoEvent += doEvent; //standard assignement by passing the method delegate. Advantage you can unsubscribe
DoEvent += (o, e) => { }; //lambada assignment event arguaments
DoEvent += delegate { }; //inline delegate assignement with no event arguments
DoEvent += delegate (object o, EventArgs e) { }; //inline delegate assignment with event argumes

您选择的最终结果是相同的,您正在订阅来自控件的事件

答案 1 :(得分:0)

这只是Microsoft选择用于添加事件所在的多播委托的运算符。您可以使用语法为事件添加多个事件处理程序。

答案 2 :(得分:0)

例如,您有一些公共属性来存储代理

public Action PublicDelegate { get; set; }

有些代码使用此属性:

PublicDelegate += () => {/* some code */};

如何保护您的财产免遭覆盖,例如:

PublicDelegate = null;

为防止此类代码,"事件"关键字即将到来。

"事件"关键字只是一种语法糖,可以保护委托类型的属性不被覆盖。您只能从此属性中添加(+ =)或删除( - =),但不能直接更改整个属性。

答案 3 :(得分:0)

  

我是ASP.NET的新手,我有一个关于添加事件处理程序的问题   到一个按钮

您无需手动绑定点击事件。相反,你可以在前端绑定它。

历史 - 旧的 ASP.Net网站项目(10年前)没有设计器文件,所以我们手动拥有在Page_Load中绑定它。我们不必再在 ASP.Net Web应用程序中执行此操作。

ASPX

<asp:Button ID="SubmitButton" runat="server"  Text="Submit" OnClick="SubmitButton_Click"/>

代码背后

protected void Page_Load(object sender, EventArgs e)
{
}

protected void SubmitButton_Click(object sender, EventArgs e)
{
    // Do something after post back.
}

答案 4 :(得分:0)

想象一个像家务清单这样的事件。调用事件时,每个杂务按照添加的顺序执行。它们也可以减去。所以当你使用+ =时,你会在列表末尾添加另一项杂事。

如果您在列表中只有一件苦差事,使用+ =感觉有点像矫枉过正,但是不允许使用=和委托一样,因为如果有的话,这将删除列表中的所有其他杂务。

因此事件与委托不同的主要原因是事件只允许一次修改一个杂项列表;这是要求使用+ =或 - =排他性的。