none
Не понимаю механизм работы RRS feed

  • Общие обсуждения

  • Написал класс:

        Public Class Arr
            Private _Arr As Byte()
            Private _ArrLen As Integer
    
            Public Sub New(ByRef Arr As Byte())
                Me._Arr = Arr
                If Me._Arr IsNot Nothing Then Me._ArrLen = Me._Arr.Length
            End Sub
    
            Public Sub Add(ByVal Arr As Byte())
                Dim intArrayLength As Integer = Arr.Length
                Dim intPosition As Integer = Me._ArrLen
    
                Me._ArrLen += intArrayLength
                System.Array.Resize(Of Byte)(Me._Arr, Me._ArrLen)
                System.Array.Copy(Arr, 0, Me._Arr, intPosition, intArrayLength)
    
                intArrayLength = Nothing
                intPosition = Nothing
            End Sub
    
            Public Sub Clear()
                System.Array.Clear(Me._Arr, 0, Me._ArrLen)
            End Sub
        End Class

    Использую его:

            Dim arrBytTest As Byte() = {1, 2, 3, 4}
            Dim clsArr As New Arr(arrBytTest)
            clsArr.Clear()
    

    arrBytTest = {0, 0, 0, 0} как и clsArr._Arr = {0, 0, 0, 0}

    Использую следующим образом:

            Dim arrBytTest As Byte()
            Dim clsArr As New Arr(arrBytTest)
            clsArr.Add({1, 2, 3, 4})

    arrBytTest = Nothing, а clsArr._Arr = {1, 2, 3, 4}.

    Объясните, пожалуйста, как так? Массив arrBytTest передается по ссылке. В первом случае он меняется, во втором — нет.

    24 августа 2016 г. 14:51

Все ответы

  • А в первом случае вы смотрите значение после System.Array.Clear?

    Если так, что все вполне логично. Передав arrBytTest по ссылке вы в процедуре Clear очищая Me._Arr, очищаете и arrBytTest, так как по сути это одно и то же.


    VB.Net - WPF, UWP

    24 августа 2016 г. 15:20
    Отвечающий
  • А в первом случае вы смотрите значение после System.Array.Clear?

    Если так, что все вполне логично. Передав arrBytTest по ссылке вы в процедуре Clear очищая Me._Arr, очищаете и arrBytTest, так как по сути это одно и то же.


    VB.Net - WPF, UWP

    Ещё раз: в первом случае массив отчищается, потому как передан по ссылке. Почему во втором случае, где массив передается также по ссылке, у arrBytTest = Nothing, а clsArr._Arr = {1, 2, 3, 4}? Как так?

    24 августа 2016 г. 16:22
  • Nothing потому, что массив еще не инициализирован. В Add он инициализируется и с помощью Copy копируется значение. Соответственно передача по ссылке уже потеряна.

    UPD. Хотя скорее всего в первом случае копирование ссылку не собьют. Во втором ссылка не передается, так как объект еще Nothing.


    VB.Net - WPF, UWP

    • Изменено LXGDARKEditor 24 августа 2016 г. 16:42
    24 августа 2016 г. 16:36
    Отвечающий
  • Чуть-чуть изменю.

            Dim arrBytTest As Byte() = {7}
            Dim clsArr As New Arr(arrBytTest)
            clsArr.Add({1, 2, 3, 4})

    Я так понимаю arrBytTest, как Вы говорите, уже инициализирован.

    Результат:

    arrBytTest = {7}, clsArr._Arr = {7, 1, 2, 3, 4}.

    Или я неправильно Вас понял?

    24 августа 2016 г. 16:46
  • Правильно поняли. Значит весь подвох в том, как работают System.Array.Resize и System.Array.Copy.

    Выходит, что эти методы работают со значениями, а не со ссылкой.

    UPD. Скорее всего Resize инициализирует объект заново, поэтому Me._Arr уже становится самостоятельным.


    VB.Net - WPF, UWP

    • Изменено LXGDARKEditor 24 августа 2016 г. 16:51
    24 августа 2016 г. 16:49
    Отвечающий
  • В общем пойду окольными путями.
    24 августа 2016 г. 16:51