2010-10-16 4 views

Répondre

8

Une référence est juste que ... une référence à un objet qui est stocké dans la mémoire. À moins que vous n'écriviez explicitement du code pour créer un clone et que vous renvoyiez une référence à cet objet, vous passerez toujours une référence à la même instance.

La situation que vous tentez d'éviter est de transmettre une référence d'objet à l'appelant dont vous dépendez. Vous n'avez aucun contrôle sur qui ou quoi pourrait changer l'état de cet objet et donc votre classe pourrait se retrouver avec des résultats imprévisibles.

Un exemple stupide:

public class Employee 
{ 
    public Salary Salary {get; set;} 

    public void GiveRaise() 
    { 
     Salary.Total *= .25; 

     if(Salary.Total > 100000) 
     { 
      Promote(); 
      GiveBiggerOffice(); 
     } 
     else 
     { 
      GiveWatch(); 
     } 
    } 
} 

Disons donc que ce gars-là avait un salaire de 50 000 $ et vient d'avoir une augmentation. Maintenant, son salaire est de 62 500 $ et il devrait avoir une belle nouvelle montre. Cependant, il est très possible qu'un autre thread ait une référence à cet objet Employee. Cela signifie qu'ils ont également accès à la propriété Salary et que le total des salaires peut être supérieur à 100 000 USD avant l'exécution du bloc if.

Dans ce scénario délicat, l'employé obtiendrait une promotion et un nouveau bureau même si la méthode Raise() n'a été appelée qu'une seule fois.

Silly Je sais, mais démontre le point.

+3

Correction (puisque j'ai besoin de 2 rep de plus avant que je puisse éditer votre message!): "... vous passerez toujours une référence à la même instance". – dty

+0

Ce que vous dites, c'est que C# ne crée pas de copies clonées automatiquement lorsque vous renvoyez par exemple un type 'Date'. – Tarik

+0

@Braveyard: 'DateTime' (que je suppose que vous voulez dire) est un type de valeur, pas un type de référence. –

Questions connexes