我读过String
是一个“引用类型”,与整数不同。 MS website
我试图测试它的行为。
Sub Main()
Dim s As New TheTest
s.TheString = "42"
Dim z As String = s.GimmeTheString
z = z & "000"
Dim E As String = s.TheString
s.GimmeByref(z)
end sub
Class TheTest
Public TheString As String
Public Function GimmeTheString() As String
Return TheString
End Function
Public Sub GimmeByref(s As String)
s = TheString
End Sub
End Class
所以我期待:
z
与TheString
的引用相同,因此TheString
将设置为“42000”Z
通过引用修改GimmeByref
,因此Z
设置为TheString
实际结果:
我错过了什么?
我还尝试在GimmeByRef
中添加“ByRef”:显然GimmeByRef
确实按预期工作,但如果我将所有内容都设置为Integer,也称为“值类型”。
这些类型之间是否存在实际差异?
答案 0 :(得分:3)
混淆是因为无论类型,在VB中传递的参数默认传递值 。
如果要通过引用传递参数,则需要将参数类型指定为ByRef
:
Public Sub GimmeByref(ByRef s As String)
您还需要了解变异值和重新分配变量之间的区别。在方法内部执行s = TheString
不会改变字符串的值,它重新分配 s
。无论类型是值还是引用类型,显然都可以这样做。
值和引用类型之间的差异在修改值本身时会产生,而不是变量:
obj.ModifyMe()
.NET中的字符串是不可变的,因此不具备任何此类方法(与整数相同)。但是,List(Of String)
例如是一个可变引用类型。因此,如果您修改类型为List(Of String)
的参数,,即使它是按值传递,那么对象本身也会被修改,超出方法的范围。
答案 1 :(得分:3)
字符串是不可变的,每次进行更改时,它都会创建一个新的“引用”,就像调用New一样。
String对象称为immutable(只读),因为它的值 创建后无法修改。出现的方法 修改一个String对象实际上返回一个新的String对象 包含修改。 Ref
您的代码基本上是这样的:
Sub Main()
Dim a, b As String
a = "12"
b = a
a = a & "13"
Console.WriteLine(a) ' 1213
Console.WriteLine(b) ' 12
Console.ReadLine()
End Sub