我们假设以下示例:
当我从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
为什么会这样?
答案 0 :(得分:0)
在变量_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
或者
答案 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":
此时我正在将pname
的值更改为" Alex":
请注意,虽然我已将
_name2
更改为" Alex",_name
仍设置为" John"。
注意pname
的值如何变为" Alex"因为对import re
my_string = "America's mom, American"
re.findall(r'\bAm[a-zA-Z]+\b', my_string)
所做的更改:
我不确定你是在做什么并试图在这里实现,但希望这个例子能让你更好地理解。另一种方法是使用共享变量,如另一个答案所述。