代码之家  ›  专栏  ›  技术社区  ›  El Ronnoco

这是某种引用问题吗?不粘值

  •  1
  • El Ronnoco  · 技术社区  · 14 年前

    为这个骇人听闻的头衔道歉。

    我已经模拟了这段代码来模拟我在项目中遇到的一个问题。

    我想知道为什么 地位 不“坚持”。单步执行代码,我甚至可以看到它在设置属性!

    结构是一种价值类型吗?

    这是代码,它是独立的。

    Imports System.Diagnostics
    
    Public Class clsTest
        Public Shared Sub test()
            Dim myHolder As New holder
    
            myHolder.info = New info(5)
            With myHolder.info
                Debug.Print("Initialised Status : {0}", .status)
                Debug.Print("Initialised Original Status : {0}", .originalStatus)
                myHolder.setStatusToTen()
                Debug.Print("Next Status : {0}", .status)
                Debug.Print("Next Original Status : {0}", .originalStatus)
            End With
        End Sub
    End Class
    
    Public Class holder
        Private _heldInfo As info
    
        Public Property info() As info
            Get
                Return _heldInfo
            End Get
            Set(ByVal value As info)
                _heldInfo = value
            End Set
        End Property
    
        Public Sub setStatusToTen()
            _heldInfo.status = 10
        End Sub
    End Class
    
    Public Structure info
        Private _iOriginalStatus, _iStatus As Integer
    
        Public Sub New(ByVal iStartingStatus As Integer)
            _iOriginalStatus = iStartingStatus
        End Sub
    
        Public ReadOnly Property originalStatus() As Integer
            Get
                Return _iOriginalStatus
            End Get
        End Property
    
        Public Property status() As Integer
            Get
                Return _iStatus
            End Get
            Set(ByVal value As Integer)
                _iStatus = value
            End Set
        End Property
    End Structure
    

    当我奔跑 clsTest.test 我得到以下输出-

    clsTest.test
    Initialised Status : 0
    Initialised Original Status : 5
    Next Status : 0
    Next Original Status : 5
    

    即使… setStatusToTen 做的正是罐头上说的!

    2 回复  |  直到 14 年前
        1
  •  1
  •   codeulike    14 年前

    See this C# example

    Set(ByVal value As info)
            _heldInfo = value
    End Set
    

    holder _heldInfo myHolder.info

    Public Sub printStatus()
        Debug.Print("Internal Status : {0}", _heldInfo.status)
    End Sub
    

    10