如果没有ByRef,可以如何更改来自不同类/表单的值

时间:2017-05-12 19:25:40

标签: vb.net

我们假设以下示例:

当我从Form1调用Form2并传递Form1值的_name时。当我显示Form1的_name = Alex?我没有在Form2中更改pname,构造函数不包含ByRef。

示例代码:

Public Form1
    Public _name as String

    Sub New
        _name = "John"
        Dim bla as New Form2(_name)
        'now _name=Alex !!
    End Sub
End Class

Public Form2
    Property _name2 as String

    Sub New(pname as String)    'no ByVal !!
           _name2 = pname       'even if would be ByVal no pname changed !
           _name2 = "Alex"
    End Sub
End Class

为什么会这样?

2 个答案:

答案 0 :(得分:0)

  1. 在变量_name中使用Shared:

    Class Form1
    
    
        Public Shared _name As String
    
        Public Sub New()
            _name = "John"
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Message "John"
            MessageBox.Show(_name)
    
            Dim bla As New Form2()
            bla.Show()
    
            ' Message "Alex"
            MessageBox.Show(_name)
    
        End Sub
    
    End Class
    
    
    Public Class Form2
    
        Property _name2 As String
    
        Sub New()
    
            _name2 = "Alex"
            Form1._name = _name2
    
        End Sub
    
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' message Alex
            MessageBox.Show(_name2)
    
            ' message Alex
            MessageBox.Show(Form1._name)
    
        End Sub
    End Class
    
  2. 或者

    1. 如果未在构造函数(方法)的签名中输入修饰符,则默认值为byVal。如果要在form2中更改变量的值,则必须在form2构造函数签名中通知byref: Sub New(byref _name as String)

答案 1 :(得分:0)

要更改参数的基础值,您必须使用ByRef modifer

  

指定以这样的方式传递参数:被调用的过程可以更改调用代码中参数的变量值。

这与ByVal略有不同:

  

指定以这样的方式传递参数:被调用的过程或属性不能更改调用代码中参数的变量值。

默认情况下,如果未在modifier中指定VB.NET,编译器将使用ByVal

  

此处请注意,虽然VB.NET默认情况下使用ByVal但未指定VBA,但ByRef不会,而默认使用name2。如果您将代码从一个代码移植到另一个代码,请注意这一点。

此外,您正在更改pname,而您应该更改Public Class Form1 Private _name As String Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load _name = "John" Dim bla As New Form2(_name) bla.Show() Debug.WriteLine(_name) End Sub End Class Public Class Form2 Private Property _name2 As String Public Sub New(ByRef pname As String) InitializeComponent() _name2 = pname pname = "Alex" End Sub End Class ,如果您要更改基础值。

根据您的示例查看以下代码:

Form2

在将值传递给pname之前,名称是" John":

enter image description here

此时我正在将pname的值更改为" Alex":

enter image description here

  

请注意,虽然我已将_name2更改为" Alex",_name仍设置为" John"。

注意pname的值如何变为" Alex"因为对import re my_string = "America's mom, American" re.findall(r'\bAm[a-zA-Z]+\b', my_string) 所做的更改:

enter image description here

我不确定你是在做什么并试图在这里实现,但希望这个例子能让你更好地理解。另一种方法是使用共享变量,如另一个答案所述。