2010-11-05 6 views
1

Je viens de découvrir un comportement très étrange. J'ai une classe avec une propriété de chaîne. Dans le poseur de cette propriété je compare l'ancienne valeur avec la nouvelle valeur première et la seule propriété changer si les valeurs sont différentes:Object.ReferenceEquals renvoie des résultats incorrects (dans Silverlight 3 au moins)

 set 
     { 
      if ((object.ReferenceEquals(this.Identifier, value) != true)) 
      { 
       this.Identifier = value; 
       this.RaisePropertyChanged("Identifier"); 
      } 
     } 

Mais cette ReferenceEquals revient presque toujours faux! Même si j'appelle object.ReferenceEquals ("test", "test") dans Quick Watch Je me trompe.

Comment est-ce possible?

Répondre

0

C'est parce que strings are immutable en C#:

Le contenu d'un objet chaîne ne peut pas être changé après que l'objet est créé, bien que la syntaxe rend apparaît comme si vous pouvez le faire.

Puisque vous ne pouvez pas modifier une référence de chaîne existante, il n'y a aucun avantage à les réutiliser. La valeur transmise à votre setter de propriété sera toujours une nouvelle référence de chaîne, sauf peut-être si vous faites this.Identifier = this.Identifier;.

Je vais essayer de clarifier un exemple:

string s = "Hello, "; // s contains a new string reference. 
s += "world!";   // s now contains another string reference.