2016-09-29 3 views
0

Маленькое предисловие, я не про программист, я на самом деле инженер-механик, который знает программирование, и это мой первый вопрос здесь, поэтому, пожалуйста, несите меня. Я как бы просто помещаю грубый сводный код вместо моего фактического кода, чтобы все было просто.Почему это исправляет проблему с моим массивом Jagged?

У меня есть зубчатый массив в vb.net, который я использую для отслеживания того, сколько из некоторых данных соединений проходит через каждую «зону», где зоны являются первым индексом зубчатого массива. Я уже инициализируется массив в другом месте с:

jagged_arr()() = new double(4)() {} 

и первый из массивов всегда устанавливается заранее, например:

jagged_arr(0) = {1, 2, 3, 4} 

Так позже я пытаюсь перебирать и обрабатывать вещи в зоне, по зоне основе, по существу:

for z = 0 to 3 
    if z = 2 
    jagged_arr(z + 1) = jagged_arr(z) 'NOTE!!! 

    for r = 0 to jagged_arr(z + 1).getUpperBound(0) 
     'more calcs 
     jagged_arr(z + 1)(r) += 2 
    next 
    end if 
next 

Вместо того, чтобы дать мне массив я ожидал:

{{1, 2, 3, 4}, 
{1, 2, 3, 4}, 
{3, 4, 5, 6}, 
{3, 4, 5, 6}, 
{3, 4, 5, 6}} 

Я получаю массив так:

{{3, 2, 3, 4}, 
{3, 2, 3, 4}, 
{3, 4, 5, 6}, 
{3, 4, 5, 6}, 
{3, 4, 5, 6}} 

Я очень смущен, почему это произошло. Я еще больше запутался, почему он работал, как предполагалось после того, как я заменил уже отмечалось выше линии (с примечанием !!!) с этим:

jagged_array(z + 1) = new double(jagged_array(z).getUpperBound(0)) {} 
for i = 0 to jagged_array(z + 1).getUpperBound(0) 
    jagged_array(z + 1)(i) = jagged_array(z)(i) 
next 

Я пропускаю что-то здесь? Я не понимаю, почему каждый массив сначала копирует последнее, вызывая это странное поведение. Любая помощь приветствуется!

+0

Массивы являются ссылочными типами в .NET, а не типами значений. Вы не копируете массив, вы копируете ссылку на *** такой же массив ***. – Comintern

ответ

0

Что происходит, когда вы делаете свое изменение, в первом коде вы назначаете какой-либо «под-массив» в «другое место».
Выполняя это, вы действительно назначаете ссылку на этот массив, означающий, что jagged_array(z + 1) и jagged_array(z) теперь относится к тому же подматрица.
Еще один способ сделать это - стать псевдонимом для доступа к нему, и поэтому любые изменения, сделанные через один, отражаются на объекте, к которому обращается другой, потому что они относятся к тому же вещам.

При изменении кода, что вы делаете это создание нового объекта (новый массив) и скопировать исходное содержание в нем (Примечание есть Array.Copy для этого) и, следовательно, они не относятся к тому же объект означает модификацию через один, скажем jagged_array(z + 1), не изменяют объект, на который ссылаются jagged_array(z)

+0

Но если это так, то почему мои результаты больше не похожи на {{3, 4, 5, 6}, {3, 4, 5, 6}, {3, 4, 5, 6}, {3, 4, 5, 6}, {3, 4, 5, 6}} ? – padleyj