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

时间:2010-04-16 18:01:15

标签: c# .net mono nunit

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

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

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

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

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

这些差异的原因是什么或为什么以这种方式实施?是否存在您希望引用bool对象除了其值之外的任何内容的情况?

3 个答案:

答案 0 :(得分:5)

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

您可以在此处阅读更多相关信息:Strings in .NET and C# by Jon Skeet

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

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

答案 1 :(得分:-1)

运算符重载。

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

答案 2 :(得分:-1)

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