我已经在VB.NET中编程了一段时间,并且从未知道
是什么ByVal sender As System.Object, ByVal e As System.EventArgs
设计器自动创建的函数中的参数,用于处理表单上的事件。
我最近发现它们可以删除,类似于VB classic。我认为它使代码更具可读性,如果它们可以删除,那么为什么它们是第一位的。它可以设置在最初未插入的位置吗?
P.S。我正在使用Visual Basic 2010 Express
答案 0 :(得分:2)
sender
参数告诉您事件的源控件是什么,而e
参数可以为您提供有关事件的其他信息。如果您从未使用e
,并且从未使用多个控件触发相同的事件处理程序,那么您将永远不会看到差异。
如果没有参数,则无法执行此操作:
Private Sub Button1_Click() Handles Button1.Click, Button2.Click
Dim btn As Button = DirectCast(sender, Button)
MessageBox.Show(btn.Text)
End Sub
或者可能这样:
Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
If e.Button = Windows.Forms.MouseButtons.Right Then
MessageBox.Show("Right Button Down")
End If
End Sub
答案 1 :(得分:1)
"他们为什么"问题是重复的,并且已由Idle_Mind回答。
添加了处理没有参数的事件的功能(我认为在VS2008中),但它是通过简单地创建"缺失"来实现的。打电话,所以
Sub Button1_Click() Handles Button1.Click
实现为
Sub Lambda1(ByVal s As Object, ByVal e As EventArgs) Handles Button1.Click
Button1_Click()
End Sub
Sub Button1_Click()
由于callstack中的额外调用,我避免使用该功能,而且"简单"只是忽略你不能使用的参数。
答案 2 :(得分:1)
您的问题表明您的VS选项存在更深层次的问题。
调用事件处理程序时,会将这些参数传递给它。你真的应该有符合方法签名的方法调用。
如果您使用Option Strict On,那么VS会告诉您某些事情是不对的。我强烈建议将On设置为新项目的默认设置,并且每次安装VS时,这都是您做的第一件事。
如果你没有完全匹配方法和它们的调用,那么使用Option Strict Off,编译器必须猜测你的意思并摆弄它以试图获得将运行的东西。有时它会正确猜测,有时它不会。
您可能希望调用类似事件处理程序的方法而不指定发件人或事件标记,您可以使用
执行此操作Button1_Click(Nothing, EventArgs.Empty)
虽然在这种情况下,让事件处理程序调用一个可以单独调用的方法通常会更简洁:
不那么好:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' a load of code here
End Sub
Private Sub DoSomething()
' some code
Button1_Click(Nothing, EventArgs.Empty)
' some more code
End Sub
更好:
Private Sub DoStuff()
' a load of code here
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DoStuff()
End Sub
Private Sub DoSomething()
' some code
DoStuff()
' some more code
End Sub
(我的代码没有显示ByVal
,因为我使用VS2013 Express来编写它,因为ByVal是默认设置,所以没有使用它。)
当您设置Option Strict On时,您可能会发现很多类型不匹配错误。不要沮丧:一次检查一个,以确保所有变量类型都正确匹配。 VS甚至会建议一些可以自动为你做出的更正;花点时间看一下建议而不是轻率地接受它们,因为它只有99.9%的时间才能正常使用,在某些情况下,对代码的其他轻微更改将消除对建议更改的需要。
编辑:正如Mark Hurd在答案中指出的那样,VS将自动弥补错误的方法签名。像他一样,我不能建议利用它。