参考和价值类型

时间:2017-06-13 12:38:52

标签: vb.net types pass-by-reference

我读过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

所以我期待:

  1. zTheString的引用相同,因此TheString将设置为“42000”
  2. 然后Z通过引用修改GimmeByref,因此Z设置为TheString
  3. 实际结果:

    1. Z = “42000”
    2. E = “42”
    3. TheString = “42”
    4. 我错过了什么? 我还尝试在GimmeByRef中添加“ByRef”:显然GimmeByRef确实按预期工作,但如果我将所有内容都设置为Integer,也称为“值类型”。 这些类型之间是否存在实际差异?

2 个答案:

答案 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