我无法理解VB.NET中的以下代码发生了什么。当我运行此代码时:
Public Function test() As Boolean
Dim a As Integer = 1
Dim b As Object = a
Dim c As Object = b
Return Object.ReferenceEquals(b, c)
End Function
然后该函数返回True
。但是,如果我运行这个:
Structure TTest
Dim i As Integer
Dim tid As Integer
Sub New(ByVal _i As Integer, ByVal _tid As Integer)
i = _i
tid = _tid
End Sub
End Structure
Public Function test_2() As Boolean
Dim a As New TTest(1, 1)
Dim b As Object = a
Dim c As Object = b
Return Object.ReferenceEquals(b, c)
End Function
然后它返回False
。在这两个函数中,我声明了两个值类型变量,第一个是Integer
,第二个是自定义Structure
。两者都应该在对象分配时装箱,但在第二个示例中,它似乎被装入两个不同的对象,因此Object.ReferenceEquals
返回False
。
为什么这样工作?
答案 0 :(得分:1)
对于原始类型,.Net能够为相同的值重复使用相同的“框”,从而通过减少分配来提高性能。
答案 1 :(得分:0)
与字符串相同,它是优化事物的.NET方式。但是一旦你使用它,引用就会改变。
Sub Main()
Dim a As String = "abc"
Dim b As String = "abc"
Console.WriteLine(Object.ReferenceEquals(a, b)) ' True
b = "123"
Console.WriteLine(Object.ReferenceEquals(a, b)) ' False
Console.ReadLine()
End Sub