Question

Je migre entre C ++ et VB.NET dans mes projets de codage ... ce qui entraîne parfois une confusion quant au moment où quelque chose se présente par valeur ou par référence dans VB.NET.

Disons par exemple que j'ai un tableau de MyObject qui est rempli avec un tas d'objets.

dim MyArr(5000) of MyObject

Supposons maintenant que les informations de ce tableau transitent par diverses structures de données:

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

puis

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

Dans le scénario ci-dessus, je pense que tout est par référence. Si j'extrais une entrée de " MyTable " et modifier ses membres MyObject, je pense que l'original dans MyArr sera modifié.

Cependant, j'ai rencontré des situations où je pensais que quelque chose était par référence et que c'était par valeur.

Les éléments sont-ils toujours ajoutés aux conteneurs par référence, ou sont-ils parfois ajoutés par valeur?

Je suis confus.

Était-ce utile?

La solution

Ce n'est pas un cas de "référence" ou "par valeur" vraiment. La valeur que vous transmettez à la méthode Add est copiée. Cependant, pour les types de référence, cette valeur est une référence à un objet - et si vous manipulez cet objet via d'autres références, vous pourrez voir ces modifications quelle que soit l'application atteinte.

Si vous voyez des copies indépendantes des données elles-mêmes, cela vous suggère d'utiliser un type de valeur ... mais si vous apportez des modifications , cela signifie que vous utilisez un mutable type de valeur, ce qui est une mauvaise idée. Les types de valeur doivent presque toujours être immuables, sinon cela crée beaucoup de confusion. (Les types de référence peuvent aussi être immuables - string en est un bon exemple.)

Pour plus d'informations sur les types de référence et les types de valeur, consultez mes articles sur les références . et paramètres . Ils sont écrits dans une perspective C #, mais les principes fondamentaux s’appliquent également à VB.

Je pense qu'une fois que vous aurez compris la distinction entre une valeur de type valeur et une référence, les collections auront plus de sens pour vous.

Autres conseils

Vous pouvez utiliser cette règle: si vous pouvez affecter null à object, il sera transmis par référence. Sinon, il sera passé par valeur.

L'exception à cette règle concerne les types et structures Nullable. Ils sont toujours passés par valeur.

Je pense que cela dépend du type d’éléments. Pas sur les collections.

Exemple:

int [] ints = new int [10];

ints [0] = 1; // -)

dans ce cas, 1 sera copié tant que c'est ValueType.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top