Контейнеры - PullRequest
       12

Контейнеры

1 голос
/ 25 октября 2009

Я мигрирую между C ++ и VB.NET в моих проектах по кодированию ... что иногда приводит к путанице в отношении того, когда что-то является ценностью или ссылкой в ​​VB.NET.

Скажем, например, что у меня есть массив MyObject, который заполнен кучей объектов.

dim MyArr(5000) of MyObject

Теперь предположим, что информация из этого массива перемещается по различным структурам данных:

dim MyList as new List(of MyObject)
for i as integer = 0 to 5000 step 1000
  Mylist.add(MyArr(i))
next

тогда

dim MyTable as new HashTable
dim i as integer = 0
for each O as MyObject in Mylist
  if i mod 2 = 0 then
     MyTable.add(O.ToString(), O)
  end if
next

В вышеупомянутом сценарии я считаю, что все по ссылке. Если я извлекаю запись из «MyTable» и изменяю ее члены MyObject, я думаю, что оригинал в MyArr будет изменен.

Однако я сталкивался с ситуациями, когда я думал, что что-то было по ссылке, и это было по значению.

Всегда ли элементы добавляются в контейнеры по ссылке или иногда они добавляются по значению?

Я в замешательстве.

Ответы [ 3 ]

4 голосов
/ 25 октября 2009

Это на самом деле не случай "по ссылке" или "по стоимости". Значение, которое вы передаете в метод Add, копируется. Однако для ссылочных типов это значение является ссылкой на объект - и если вы будете манипулировать этим объектом с помощью других ссылок на него, вы сможете увидеть эти изменения, как только доберетесь до объекта.

Если вы когда-либо видите независимые копии самих данных, это говорит о том, что вы используете тип значения ... но если вы вносите изменений , это говорит о том, что вы используете изменяемый тип значения, что является плохой идеей. Типы значений почти всегда должны быть неизменными, в противном случае это может привести к путанице. (Типы ссылок также могут быть неизменными - хороший пример - строка.)

Подробнее о ссылочных типах и типах значений см. В моих статьях по ссылкам и параметрам . Они написаны с точки зрения C #, но основные принципы применимы и к VB.

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

2 голосов
/ 25 октября 2009

Вы можете использовать это правило: если вы можете присвоить null объекту, то он будет передан по ссылке. В противном случае оно будет передано по значению.

Исключением из этого правила являются Nullable типы и структуры. Они всегда передаются по значению.

1 голос
/ 25 октября 2009

Я думаю, это зависит от типа предметов. Не в коллекциях.

например:.

int [] ints = new int [10];

целых [0] = 1; // -)

в этом случае 1 будет скопировано, пока это ValueType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...