“Bool” en tant qu’object vs “chaîne” en tant qu’object testant l’égalité

Je suis relativement nouveau en C # et j’ai remarqué quelque chose d’intéressant aujourd’hui qui, je suppose, ne m’a jamais fait remarquer ou qui me manque peut-être. Voici un test NUnit pour donner un exemple:

object boolean1 = false; object booloan2 = false; Assert.That(boolean1 == booloan2); 

Ce test unitaire échoue, mais celui-ci réussit:

 object ssortingng1 = "ssortingng"; object ssortingng2 = "ssortingng"; Assert.That(ssortingng1 == ssortingng2); 

Je ne suis pas surpris que le premier échoue en tant que boolean1, et boolean2 sont des références différentes. Mais il est troublant pour moi que le premier échoue et que le second passe. J’ai lu (quelque part sur MSDN) que de la magie avait été apscope à la classe Ssortingng pour faciliter cette opération. Je pense que ma question est vraiment pourquoi ce comportement n’a pas été reproduit dans bool? En remarque … si les boolean1 et 2 sont déclarés comme bool alors il n’y a pas de problème.

Quelle est la raison de ces différences ou pourquoi cela a-t-il été implémenté? Y a-t-il une situation dans laquelle vous voudriez référencer un object bool pour autre chose que sa valeur?

C’est parce que les chaînes font en fait référence à la même instance. Les chaînes sont internées afin que des chaînes uniques soient réutilisées. Cela signifie que dans votre code, les deux variables de chaîne feront référence à la même instance de chaîne internée.

Vous pouvez en lire plus ici: Ssortingngs in .NET et C # ( par Jon Skeet )

Mettre à jour
Juste pour être complet; comme Anthony le fait remarquer, les littéraux de chaîne sont internés, ce qui peut être montré avec le code suivant:

 object firstSsortingng = "ssortingng1"; object secondSsortingng = "ssortingng1"; Console.WriteLine(firstSsortingng == secondSsortingng); // prints True int n = 1; object firstSsortingng = "ssortingng" + n.ToSsortingng(); object secondSsortingng = "ssortingng" + n.ToSsortingng(); Console.WriteLine(firstSsortingng == secondSsortingng); // prints False 

Surcharge de l’opérateur.

La classe booléenne n’a pas d’opérateur surchargé ==. La classe Ssortingng fait.

Comme Fredrik l’a dit, vous faites une comparaison de référence avec la comparaison booléenne. La raison pour laquelle le scénario de chaîne fonctionne est parce que l’opérateur == a été surchargé pour que les chaînes puissent comparer les valeurs. Consultez la page System.Ssortingng sur MSDN.