“bool”作为对象vs“string”作为对象测试相等

我对C#比较陌生,今天我注意到一些有趣的东西,我想我从来没有注意到,或者我错过了一些东西。 这是一个NUnit测试给出一个例子:

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

这个unit testing失败,但是这个测试通过:

 object string1 = "string"; object string2 = "string"; Assert.That(string1 == string2); 

我并不感到惊讶,第一个看不到boolean1,而boolean2是不同的引用。 但令我不安的是,第一个失败了,第二个失败了。 我读过(在某个MSDN上)对String类做了一些魔术来促进这一点。 我认为我的问题真的是为什么这个行为不是在bool中复制了? 作为注释……如果boolean1和2被声明为bool ,则没有问题。

这些差异的原因是什么或为什么以这种方式实施? 是否有一种情况,你想要引用一个bool对象除了它的值以外的任何东西?

这是因为字符串实际上是指同一个实例。 字符串被实现,因此可以重用唯一的字符串。 这意味着在您的代码中,两个字符串变量将引用相同的实习字符串实例。

你可以在这里阅读更多相关内容: .NET和C#中的字符串 ( 作者Jon Skeet

更新
只是为了完整; 正如安东尼所指出的那样,字符串文字被实习,可以用以下代码显示:

 object firstString = "string1"; object secondString = "string1"; Console.WriteLine(firstString == secondString); // prints True int n = 1; object firstString = "string" + n.ToString(); object secondString = "string" + n.ToString(); Console.WriteLine(firstString == secondString); // prints False 

运算符重载。

Boolean类没有重载的==运算符。 String类有。

正如Fredrik所说,你正在做一个与布尔比较的参考比较。 字符串场景工作的原因是因为==运算符已被重载以使字符串进行值比较。 请参阅MSDN上的System.String页面。