为什么.NET中的事件使用sender作为参数?

时间:2010-01-12 07:29:45

标签: c# asp.net

当我在ASPX页面中为Web控件添加事件处理程序时 - 为什么它会传递给发件人?使用发送者与仅通过事件处理程序中的“ID”引用控件有什么好处?

我可以看到我是否有一个处理事件的单独类,并且多个控件将使用事件处理程序。但是如果我确定只有这个控件会处理这个事件,那么引用控件ID而不是将发送者强制转换为我的对象类型是不是很糟糕?

谢谢!

6 个答案:

答案 0 :(得分:12)

您似乎只是从ASP.NET角度看.NET事件。 .NET事件模型广泛用于整个.NET Framework,而不仅仅用于ASP.NET页面和控件。

此模式非常灵活,允许任何(正确预期的)对象成为事件的起源,允许事件侦听器在引发它的对象上“归零”以进行进一步处理。请记住,事件不仅需要一个原点和一个侦听器/处理程序。

页面和控件都是对象,因此为了使其足够灵活,发件人是键入的对象。对于某些编程规则,应该能够定义可以引发该事件并将发送方对象强制转换回原始类型的已知类型。如果它纯粹是一个字符串控件ID,则必须找到具有匹配ID的控件,这在填充了大量控件层的页面中可能并不容易。

答案 1 :(得分:11)

优点是您可以将相同的事件处理程序附加到多个控件的事件。由于您不知道在这种情况下引发事件的控件,您可以使用sender参数来引用它。

答案 2 :(得分:3)

控件不需要具有ID,并且事件可以由多个控件抛出。使对象成为发送方意味着您可以从没有ID和一般对象的控件中捕获事件。

答案 3 :(得分:1)

作为上述答案的补充,当您在Repeater内创建按钮时,发件人可能会很方便。假设您为此重复输出100个订单或任何其他数据,并且您想要检查一个显示“OK”的按钮,您不希望能够按“OK”两次。

因此,在您的方法中,您可以将发件人用作:

Button b = sender as Button;
b.Enabled = false;

答案 4 :(得分:1)

您不使用控件ID引用引发事件的实例的另一个原因是事件系统跨越.NET框架而不仅仅是ASP.NET。引发事件的其他类型不一定具有控件ID(甚至可能根本不是控件)。

答案 5 :(得分:0)

Filip,dtb

以你的榜样,我们正在进入事件处理的危险世界。 将发送者对象类型转换为其他类型实际上将“知识”注入到事件处理程序中,即通过按钮调用此事件处理程序。这使得事件处理程序无法被其他类型的控件或类使用。

分享事件处理程序听起来是个好主意,但根据我自己的经验(并查看其他人的代码),它经常被滥用而不是使用。没错,有了中继器,你没有太多选择。 我想说的就是要小心你在实际的事件处理程序中编写代码,并考虑创建一个函数,如果它超过三行。

吹毛求疵:

Button b = sender as Button; 
if(b != null)
{
  b.Enabled = false; 
}

甚至更好:

Button clickedButton = sender as Button; 
if(clickedButton != null)
{
  clickedButton.Enabled = false; 
}

问题:为什么Enabled属性呈现为Type?