我对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对象除了其值之外的任何内容的情况?
答案 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页面。