"bool"作为对象vs"string"作为对象测试相等

Ray*_*aph 2 .net c# mono nunit

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

object boolean1 = false;
object booloan2 = false;
Assert.That(boolean1 == booloan2);
Run Code Online (Sandbox Code Playgroud)

此单元测试失败,但是这个测试通过:

object string1 = "string";
object string2 = "string";
Assert.That(string1 == string2);
Run Code Online (Sandbox Code Playgroud)

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

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

Fre*_*örk 6

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

你可以在这里阅读更多关于它的信息:.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
Run Code Online (Sandbox Code Playgroud)