引用和值类型

Reference and Value types

我读到 String 是一个 "reference type",与整数不同。 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

所以我预计:

  1. zTheString 的引用相同,因此 TheString 将设置为“42000”
  2. 然后 ZGimmeByref 引用修改,因此 Z 被设置为任何 TheString

实际结果:

  1. Z="42000"
  2. E="42"
  3. TheString="42"

我错过了什么? 我还尝试在 GimmeByRef 中添加 "ByRef" :是的,显然 GimmeByRef 确实按预期工作,但如果我将所有内容都作为整数,它也会起作用,据说是 "Value type" . 这些类型之间有什么实际区别吗?

混淆的产生是因为不管类型传入VB的参数是按值传递 默认.

如果要通过引用传递参数,需要将参数类型指定为ByRef:

Public Sub GimmeByref(ByRef s As String)

您还需要了解改变值和重新分配变量之间的区别。在方法内部执行 s = TheString 不会改变字符串的值,它 重新分配 s。无论类型是值类型还是引用类型,这显然都可以完成。

当修改值本身而不是变量时,值类型和引用类型之间的区别开始出现:

obj.ModifyMe()

.NET 中的字符串是不可变的,因此不具有任何此类方法(与整数相同)。但是,例如,List(Of String) 是可变引用类型。所以如果你修改一个List(Of String)类型的参数,即使它是通过值传递的,那么对象本身也被修改超出了方法的范围

字符串是不可变的,每次您进行更改时都会创建一个新的 "reference",就像调用 New 一样。

A String object is called immutable (read-only), because its value cannot be modified after it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification. 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