Это какая-то проблема со ссылками? Значение не прилипает - PullRequest
1 голос
/ 28 сентября 2010

Извиняюсь за ужасный заголовок.

Я смоделировал этот код, чтобы имитировать проблему, с которой я столкнулся в проекте.

Я хочу знать, почему свойство status не «прилипает».Проходя по коду, я даже вижу, как он устанавливает свойство!

Это как-то связано со структурой, являющейся типом значения?

Вот код, он автономный.

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 ]

2 голосов
/ 28 сентября 2010

Это еще один случай, когда изменчивые структуры являются злом. Избегайте использования структур для этой цели. Для справки:

Почему изменчивые структуры являются «злыми»?

1 голос
/ 28 сентября 2010

Да, потому что структуры являются типами значений.Когда объект структуры присваивается другому объекту структуры, все содержимое структуры копируется и дублируется.( См. Этот пример C # )

Итак, в вашем коде этот набор:

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.

...