引用和值类型
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
所以我预计:
z
与 TheString
的引用相同,因此 TheString
将设置为“42000”
- 然后
Z
被 GimmeByref
引用修改,因此 Z
被设置为任何 TheString
是
实际结果:
- Z="42000"
- E="42"
- 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
我读到 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
所以我预计:
z
与TheString
的引用相同,因此TheString
将设置为“42000”- 然后
Z
被GimmeByref
引用修改,因此Z
被设置为任何TheString
是
实际结果:
- Z="42000"
- E="42"
- 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