string s1 = "hi";
string s2 = "hi";
bool x = (s1 == s2);
Console.WriteLine(bool.Parse(""+x)); //printed as true and my point of interest
x = s1.Equals(s2);
Console.WriteLine(bool.Parse("" + x));//printed as true
s1 = s2;
x = (s1 == s2);
Console.WriteLine(bool.Parse("" + x));//printed as true
x = s1.Equals(s2);
Console.WriteLine(bool.Parse("" + x));//printed as true
由于s1==s2
比较引用,因此将其作为false返回。但我得到输出为真。我只是在字符串的情况下观察到这一点。当在其他类的对象上完成此操作时,它正确地计算为false。为什么在字符串中观察到这种异常行为?
答案 0 :(得分:3)
这里有两件事。
第一个是字符串类型重载==运算符。 ==运算符的引用比较仅为默认行为。任何类型都可以重载该运算符以获得更好的语义。如果要保证引用相等,请使用ReferenceEquals()
方法。
第二种叫做interning,它允许两个具有相同值的不同字符串变量引用同一个对象。实习意味着即使没有重载的==运算符,如果两个变量的“hi”字面都被实现,==和ReferenceEquals()比较仍然可以返回true
答案 1 :(得分:2)
由于s1 == s2比较参考
这是一个错误的假设。您可以重载==
运算符以执行任何操作。
以下是如何为自己的类重载它,就像String
那样。
public class Foo
{
public int Value { get; set; }
public static bool operator ==(Foo first, Foo second)
{
return first.Value == second.Value;
}
}
答案 2 :(得分:2)
虽然string是引用类型,但是相等的运算符(==和 !=)被定义为比较字符串对象的值,而不是 引用(7.9.7字符串相等运算符)。这使得测试 字符串相等更直观。