为什么要将事件的发送者强制转换为控件类型?

时间:2015-07-14 04:15:52

标签: c# asp.net visual-studio casting

我是ASP.NET开发的新手,我试图理解为什么在处理事件处理时需要进行对象转换。

我正在阅读 ASP.NET 4 Unleashed 并遇到了这段代码,但我根本不理解它的目的。我没有通过以下方法得到演员的观点:

protected void Button_Click(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    btn.Text = (Int32.Parse(btn.Text) + 1).ToString();
} 

HTML在这里:

    First Counter:
<asp:Button
id=”Button1”
Text=”0”
OnClick=”Button_Click”
Runat=”server” />
<br /><br />
Second Counter:
<asp:Button
id=”Button2”
Text=”0”
OnClick=”Button_Click”
Runat=”server” />

我不明白将btn投射到Button的重点。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

在您了解C#event关键字和delegate类型之前,您将很难完全理解这里的推理。那说......

请注意,方法声明中的sender参数的类型为object。这是由于.NET中事件的标准模式:委托类型始终使用object参数作为委托签名的第一个参数。

这样做可以让少量的委托类型被重用于各种各样的事件。可能最常用的委托类型是EventHandler,您可以在任意数量的类中找到各种各样的事件(在.NET中有数百个,如果不是一千个或更多)。

方法签名仅使用object,而不是让框架包含每个可能的发件人的委托类型。然后由事件处理程序(例如,您的Button_Click()方法)将object引用强制转换为预期的实际类型。

请注意,在许多情况下,事件处理程序根本不需要使用sender参数。它只附加到单个事件,可以通过类中的实例字段引用的对象,或者根本不需要发送对象来处理事件(Click相当常见)事件......这里需要Button对象的唯一原因是事件处理程序是一个人为的示例,用于您正在阅读的引用。

答案 1 :(得分:0)

这不是&#34;答案&#34;因为很久以前就已经回答过了。但这是我在开始时遇到的一个问题,我没有找到一个令人满意的答案,为什么&#34;我。所以我想更多地将我的想法作为一个论坛回应#34;。我主要是VB程序员,所以请原谅我对C#问题的干扰,不过我认为其中大部分仍然适用。

关于服务器控制事件和投射&#39;发件人&#39;或其他&#34;显而易见的&#34;演员我倾向于依赖隐式演员:

Private Sub gvSomeGridView_RowDataBound(sender As Object, e As GridViewCommandEventArgs) Handles gvSomeGridView.RowDataBound
  If e.Row.RowType = DataControlRowType.DataRow Then
    Dim this As GridView = sender
    Dim drv As DataRowView = e.Row.DataItem
    Dim dk as DataKey = this.DataKeys( e.Row.RowIndex )
    Dim lbl as WebControl = e.Row.FindControl("SomeLabel")  // <asp:Label ID="SomeLabel">

    // AttributeCollection is common to all WebControls
    lbl.Attributes("data-rowidx") = e.Row.RowIndex
    lbl.Attributes("data-whatever") = dk.Value

    // Now here an explicit Cast in required
    DirectCast(lbl, Label).Text = drv("SomeFieldName")
    ...
  End If
End Sub

我过去常常使用CType()DirectCast()等,但至少在Events内,我觉得只是额外的单词并影响可读性。

过了一段时间,你才明白sender总是这个Handler所属的控件(虽然不一定是触发事件的控件)我发现在这些实例中显式转换没有任何好处因为声明的变量使得它非常清晰,而其余的隐式转换。

但是对于OP的问题&#34;为什么&#34;虽然可能是更好的编程实践,但在标准服务器控制事件处理的情况下,你真的不<当你试图获得sender持有的东西时,em>需要一个明确的演员。

另外请记住,我编写的代码每秒执行的次数不会达到数千次,你可以为每个强制转换的时间缩小毫秒数。

无论如何,我希望这有助于解释&#34;为什么&#34;或&#34;为什么不&#34;