2010-01-07 11 views
2

J'ai une classe Vector, et je testais le test unitaire suivant (en utilisant nUnit).Question de référence: quand deux objets sont-ils égaux?

1 Vector test1 = new Vector(new double[] { 6, 3, 4, 5 }); 
2 Vector test2 = test1; 
3 Assert.AreEqual(test1, test2, "Reference test"); 
4 test2 = new Vector(new double[] { 3, 3, 4, 5 }); 
5 Assert.AreEqual(test1, test2, "Reference test"); 

Le premier test de la ligne 3 passe, mais le deuxième test de la ligne 5 échoue. Est-ce que test2 ne devrait pas pointer vers la même mémoire que test1, puisque j'ai fait la déclaration d'affectation à la ligne 2? Mon vecteur est défini comme une classe, donc c'est un type de référence. D'autre part, les tests suivants passent:

1 Vector test1 = new Vector(new double[] { 6, 3, 4, 5 }); 
2 Vector test2 = test1; 
3 Assert.AreEqual(test1, test2, "Reference test"); 
4 test2[1] = 4; 
5 Assert.AreEqual(test1, test2, "Reference test"); 

Est-ce que cela veut dire que, lorsque j'utilise le nouvel opérateur pour définir un nouvel objet, de vieilles missions ne sont plus valides? Toute autre explication (ou correcte - si je me trompe)?

+0

Cette différence de comportement est * la programmation impérative * par rapport à la programmation réactive * * –

+0

Michael Greene: Non, c'est la différence entre une référence et une valeur, et comment l'opérateur « = » est mis en œuvre. –

+0

Wow !! C'était rapide - merci pour toutes les réponses. Après –

Répondre

4

La ligne

test2 = new Vector(new double[] { 3, 3, 4, 5 }); 

crée une nouvelle instance de Vector sur le tas et attribue son adresse à la variable test2. test2 pointera vers un nouvel objet complètement distinct après cela.

En revanche, la ligne

test2[1] = 4; 

ne change pas la variable test2 elle-même (qui est une référence à un objet sur le tas). Au contraire, il change l'objet vers lequel il pointe. test2 fait toujours référence au même emplacement sur le tas.

Pour résumer, dans le premier cas, vous changez la référence dans le second, vous modifiez le référent.

+0

test2 [1] = 4, vous verrez que test1 [1] sera aussi égal à 4. – Tarydon

+0

Il y a lieu de relever que test2 [1] = 4; également provoquer test1 [1] pour changer, car ils sont tous deux pointant vers le même objet. Alors bien sûr, ils sont toujours égaux. – Erik

1

Lorsque vous assignez une variable comme:

test2 = new Vector(new double[] { 3, 3, 4, 5 }); 

Vous changez la valeur de test2 être la nouvelle référence renvoyée par le côté droit de l'opérateur d'affectation. Bien sûr, la référence renvoyée ici est différente de celle de test1, car il s'agit d'un cas distinct du constructeur appelé, et les références ne pourraient pas être identiques, car le vecteur est construit avec des arguments différents.

0

Oui, lorsque vous utilisez le nouvel opérateur pour définir un nouvel objet, les anciennes affectations ne sont plus valides.

Votre vecteur EST un type de référence, mais lorsque vous dites test2 = quelque chose que vous dites "maintenant test2 pointe vers autre chose".

En aparté, si vous voulez deux différents objets vectoriels avec les mêmes valeurs internes à considérer égales, vous pouvez obtenir que par la mise en œuvre IEquatable sur votre classe Vector, mais c'est une autre question ...

0
Vector test1 = new Vector(new double[] { 6, 3, 4, 5 }); 

est la création de deux objets, le vecteur de son auto, et la référence.

Imagin vous avez une liste d'éléments sur une page.

Lorsque vous utilisez new Vector vous écrivez efficacement une nouvelle ligne sur la page qui contient le vecteur.

Objets

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

Vous avez également une liste de références (Vector test1 = new Vector) qui référances la première page, et (test2 = test1)

Références

  1. test1-> 1
  2. test2-> 1

quand vous dites « test2 = nouveau vecteur {5,4,3,2,1} vous finissez alors avec un nouvel objet vectoriel sur le premier page, et modifiez le vecteur test2 auquel il se réfère.

Objets

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

Références

  1. test1 -> 1
  2. test2 -> 2

Dans votre deuxième exemple à la fois test1 et test2 sont toujours pointant vers le même objet, ce qui explique pourquoi le test passe.