Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 是否总是需要在事件处理程序中强制转换发送方?_Vb.net_Winforms_Events - Fatal编程技术网

Vb.net 是否总是需要在事件处理程序中强制转换发送方?

Vb.net 是否总是需要在事件处理程序中强制转换发送方?,vb.net,winforms,events,Vb.net,Winforms,Events,考虑以下事件处理程序 Private Sub ProfileSelectCheckBox_CheckedChanged(sender As Object, e As EventArgs) Handles ProfileSelectCheckBox.CheckedChanged ProfilesComboBox.Enabled = ProfileSelectCheckBox.Checked End Sub 在这个处理程序中,我根本不使用sender,但是我已经看到很多人在谈论使用send

考虑以下事件处理程序

Private Sub ProfileSelectCheckBox_CheckedChanged(sender As Object, e As EventArgs) Handles ProfileSelectCheckBox.CheckedChanged
    ProfilesComboBox.Enabled = ProfileSelectCheckBox.Checked
End Sub
在这个处理程序中,我根本不使用sender,但是我已经看到很多人在谈论使用sender的模式。在我的例子中,由于处理程序没有向我传递对ProfilesComboBox的对象引用,我最终会得到一些笨拙的代码

如果在运行时为另一个复选框添加了这个处理程序,那么无论是否使用强制转换,我都会得到一些不完整的代码,这让我相信最好将处理程序的定义范围限制在方法内部,以便从外部隐藏它,但这可能有点离题


在这个简单的例子中,我认为不需要演员阵容。我的问题是,这是不赞成/不好的做法,还是简单到让它过去?

我认为根本不需要使用sender,更不用说使用它了。如果您想要一个通用的事件处理程序,强制转换可能会有所帮助,但对于像您的示例这样的特定对象,它并没有用处


然而,链接控件的更好方法可能是使用MVP模式,这将使示例中的行为更易于测试。

我认为根本不需要使用sender,更不用说强制转换了。如果您想要一个通用的事件处理程序,强制转换可能会有所帮助,但对于像您的示例这样的特定对象,它并没有用处

 Private Sub Yadayada(...) Handles ProfileSelectCheckBox.CheckedChanged
然而,链接控件的更好方法可能是使用MVP模式,这将使示例中的行为更易于测试

 Private Sub Yadayada(...) Handles ProfileSelectCheckBox.CheckedChanged
不,寄件人是谁已经很明显了。毫无疑问,它是ProfileSelectCheckBox。因为这是您在Handles子句中命名的控件。没有必要强制转换发件人,最好在代码中直接使用ProfileSelectCheckBox

这就是您编写的事件处理程序的明显用途,许多事件处理程序都是这样的。但这并不局限于此。Handles关键字接受多个事件源。你也可以这样写:

Private Sub Yadayada(...) Handles ProfileSelectCheckBox.CheckedChanged, _
                                  UserSelectCheckBox.CheckedChanged
这是具有CheckChanged事件处理程序的两个控件的事件处理程序。显然,您现在对sender参数更感兴趣,它允许您区分ProfileSelectCheckBox和触发相同CheckChanged事件的UserSelectCheckBox之间的区别

您可以无限地扩展它,将越来越多的事件源添加到Handles子句中。或者,您可以在代码中使用AddHandler语句,而不使用Handles关键字

这里的显著特点是,当您使用Winforms designer时,所有这些都不会发生。当您编写自己的代码而不是将其留给代码生成器时,就会发生这种情况。这是一次思想上的飞跃,这是一次非常重要的飞跃。它使你成为一个真正的程序员,不再需要机器人为你生成代码

祝贺你,欢迎你参加聚会

不,寄件人是谁已经很明显了。毫无疑问,它是ProfileSelectCheckBox。因为这是您在Handles子句中命名的控件。没有必要强制转换发件人,最好在代码中直接使用ProfileSelectCheckBox

这就是您编写的事件处理程序的明显用途,许多事件处理程序都是这样的。但这并不局限于此。Handles关键字接受多个事件源。你也可以这样写:

Private Sub Yadayada(...) Handles ProfileSelectCheckBox.CheckedChanged, _
                                  UserSelectCheckBox.CheckedChanged
这是具有CheckChanged事件处理程序的两个控件的事件处理程序。显然,您现在对sender参数更感兴趣,它允许您区分ProfileSelectCheckBox和触发相同CheckChanged事件的UserSelectCheckBox之间的区别

您可以无限地扩展它,将越来越多的事件源添加到Handles子句中。或者,您可以在代码中使用AddHandler语句,而不使用Handles关键字

这里的显著特点是,当您使用Winforms designer时,所有这些都不会发生。当您编写自己的代码而不是将其留给代码生成器时,就会发生这种情况。这是一次思想上的飞跃,这是一次非常重要的飞跃。它使你成为一个真正的程序员,不再需要机器人为你生成代码

祝贺你,欢迎你参加聚会