2009-10-25 9 views
1

Je migre entre C++ et VB.NET dans mes entreprises de codage ... ce qui conduit à la confusion occasionnelle quand quelque chose est en valeur ou par référence dans VB.NET. Par exemple, disons que j'ai un tableau de MyObject qui est rempli avec un tas d'objets..NET conteneurs - quand sont membres Par référence, par valeur?

dim MyArr(5000) of MyObject 

Maintenant, nous allons dire que les informations de ce tableau se déplace à travers les différentes 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 crois que tout est en référence. Si j'extrais une entrée de "MyTable" et que je modifie ses membres MyObject, je pense que l'original de MyArr sera modifié. Cependant, j'ai rencontré des situations où je pensais que quelque chose était par référence, et c'était par valeur.

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

Je suis confus.

+0

Vous devriez nous parler un peu de ces «situations» où le partage était en valeur. Votre exemple MyArray est correct. –

Répondre

4

Ce n'est pas un cas de "par référence" ou "par valeur" vraiment. La valeur que vous transmettez à la méthode Add est copiée. Toutefois, pour les types de référence, cette valeur est référence à un objet - et si vous manipulez cet objet via d'autres références, vous serez en mesure de voir ces modifications, quel que soit le type d'objet.

Si jamais vous voyez des copies indépendantes des données elles-mêmes, que vous suggère utilisez un type de valeur ... mais si vous faites des changements , qui suggère que vous utilisez un type de valeur mutable, ce qui est une mauvaise idée. Les types de valeur doivent presque toujours être immuables, sinon cela entraîne beaucoup de confusion. (Les types de référence peuvent également être immuables - la chaîne est un bon exemple.)

Pour plus d'informations sur les types de références et les types de valeurs, voir mes articles sur references et parameters. 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.

+0

Merci, je vais jeter un oeil. –

+0

Typo? il devrait être "Les types de référence peuvent être ** IM ** mutable aussi - chaîne est un bon exemple" – MarkJ

+0

@MarkJ: Merci, corrigé :) –

2

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

Une exception à cette règle concerne les types et les structures nullables. Ils sont toujours passés en valeur.

+0

Veuillez ne pas confondre "passer par référence" avec "passer la référence par valeur". Voir http://pobox.com/~skeet/csharp/parameters.html –

1

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

par exemple .:

int [] ints = new int [10];

ints [0] = 1; // -)

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