订阅事件处理程序

问题描述:

我很好奇订阅事件处理程序时的优点和缺点。订阅事件处理程序

<asp:DropDownList id="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" /> 

VS

protected void Page_Init(object sender, EventArgs e) 
{ 
    this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged); 
} 

从技术上来看,目前还没有任何两者之间的巨大差异,所以它的编码风格和个人喜好的问题。这里有几个点,你可以考虑:

  • 使用ASP.NET标记声明式方法通常是短,你不需要做所有的初始化
  • 如果初始化处理大方法在代码隐藏,你不污染只有在代码隐藏相关(虽然我不认为这是一个大问题)

在某些情况下可以使用的功能,如各方面的声明标记C#lambda表达式在代码隐藏中很好:

protected void Page_Init(object sender, EventArgs e) { 
    this.btnNext += (s1, e1) => MovePage(this.CurrentPage + 1); 
    this.btnPrev += (s2, e2) => MovePage(this.CurrentPage - 1); 
    // ... 
} 

像这样的东西可以减少您需要编写的单用途事件处理方法的数量,这应该使代码隐藏更简单。但是,我认为简单的ASP.NET应用程序的一般建议是使用声明式事件处理程序绑定,除非你有一些很好的理由不这样做(例如上面的例子)。

+1

谢谢,我喜欢将这些添加到页面init而不是标记的想法,所以我把它们放在一个方便的位置。 – Neil 2010-03-26 15:11:18

+0

你也可以让他们在标记中的同一位置。所以你不能根据这个决定做出决定。 – citronas 2010-03-26 15:13:15

+0

当然,他们都会在aspx标记中,但是如果我的页面长达500行,并且按钮和下拉列表事件都会在这个位置。 – Neil 2010-03-26 15:20:44

一个区别在于编译时检查。如果使用声明性方法,并且出于某种原因更改处理程序方法名称或签名,则在ASP.NET运行时处理该页面之前,您将不知道它。如果你在代码隐藏中使用显式绑定,那么你会得到一个编译时检查它。更稳定一点。

另外,有些人可能会认为将事件处理程序放入标记中会违背关注点分离规则。虽然使用ASP.NET Web表单,但与MVC框架中的谨慎分离不同,仍然存在一些交叉。

+0

诚然,但明确订阅确实有助于分离关注点。 – Neil 2010-03-26 15:23:05