2010-09-27 24 views
1

道歉的令人震驚的標題。這是一種引用問題嗎?價值不堅持

我嘲笑了這段代碼,模仿了我在項目中遇到的問題。

我想知道爲什麼狀態不「粘」。通過代碼,我甚至可以看到它設置屬性!

結構是一種價值類型嗎?

這是代碼,它是獨立的。

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是做正是它在錫說!

回答

1

是的,它是因爲結構是值類型。當一個結構對象被分配給另一個結構對象時,該結構的完整內容被複制和複製。 (See this C# example

因此,在你的代碼,這一套:

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

...有效地導致所取得的結構的兩個副本。一個內部爲holder,由_heldInfo表示,另一個是holder的「外部」,並且由myHolder.info表示。複製完成後,當您在其中一個上設置值時,另一個不受影響。

如果添加此方法holder

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

...你會發現在您的10價值去。

+0

好的,我想我有點理解!感謝您的printStatus()方法:) – 2010-09-28 08:03:47

2

這是另一個可變結構變爲邪惡的例子。避免爲此使用結構。作爲參考:

Why are mutable structs 「evil」?

+0

謝謝喬爾,我會看看。 – 2010-09-28 08:01:08