为什么我可以操作子例程中的变量而不将其作为参数传递?

时间:2014-01-21 06:05:58

标签: vb.net

我这个学期开始学习VB.NET课程已经有一段时间了,因为我在VB.NET中做了什么,我意识到我已经忘记了一些基础知识。在下面的示例程序中,我不需要将exampleVar传递给函数以便能够更改该值。为什么这样,我做错了什么?

Public Class Form1
    Dim exampleVar As Integer = 0


    Sub MySub()
        exampleVar = 123
    End Sub


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MySub()
        TextBox1.Text = exampleVar
    End Sub
End Class

文本框显示值123

3 个答案:

答案 0 :(得分:1)

首先关闭......

Dim exampleVar As Integer = 0

上面的代码声明只比Class Form1低1级,这意味着,它是一个全局变量,Class Form1下面的任何子类都可以访问和使用。

Sub MySub()
    exampleVar = 123
End Sub

上面的代码是一个Sub,它将exampleVar设置为123。

最后......当你的表单加载时,你调用将exampleVar等于123的Sub,之后,TextBox1.Text等同于exampleVar所持有的值123,因此它显示123.

如果那是你想要的,你没有做错任何事。如果您不想将exampleVar设置为123,请从Form_Load事件中删除MySub()。

答案 1 :(得分:0)

exampleVar是全局变量,其值等于0.在显示之前,您将使用MySub()方法更新它。

答案 2 :(得分:0)

因此,在您的示例中,变量声明位于类的“范围”内。这使得它可以访问同样位于类范围内的任何其他内容。

如果声明发生在MySub()内,例如:

Public Sub MySub()
    Dim exampleVar As Integer = 0
    exampleVar = 123
End Sub 

它在MySub范围之外是不可访问的,此时你可能不得不开始传递它,但一般记住,如果你这样做,你将主要通过'ByVal'或者按值传递。这意味着:

Public Sub MySub(ByVal arg As Integer) 
    arg = 123
End Sub 

调用此方法时不会影响原始变量,如:

Dim exampleVar As Integer = 0 
...
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MySub(exampleVar)
    TextBox1.Text = exampleVar
End Sub

在这个例子中,exampleVar仍然是0 - 我认为这是你期望的效果。

当对象传递ByVal时,它们的值将被传入,但不会传入原始对象。要以这种方式影响原始变量,可以使用ByRef,它通过“引用”传入对象。