VB.NET拳击怪异

时间:2017-07-17 13:50:34

标签: vb.net

我无法理解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

为什么这样工作?

2 个答案:

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