在每种情况下,==
的第二个操作数都是x
,其类型为object
.这意味着您使用的是普通的引用相等运算符.
现在,在第一个例子中,您使用的是具有相同内容的两个字符串constants.C#编译器将对这两个引用使用单个对象.在第二种情况下,x
和y
引用具有相同内容的不同字符串对象.这两个引用将不同,因此==
将返回False.
您可以通过以下方式修复比较:
改为使用Equals
-即overridden乘以string
(而==
运算符仅为overloaded:
Console.WriteLine(y.Equals(x)); // or x.Equals(y), or Equals(y, x)
如果其中一个参数可以为null,那么使用static Equals(object, object)
方法可能会很有用;这意味着你不需要担心NullReferenceException
.
将两个变量都设为string
类型,此时将在编译时选取string
内的==
重载,并且该重载将比较字符串的内容,而不仅仅是引用
值得注意的是,C#编译器注意到的不仅仅是字符串本身,而是编译时常量表达式.例如:
object x = "mehdi emrani";
string y = "mehdi " + "emrani";
Console.WriteLine(y == x); // True
在这里,y
是使用两个字符串来初始化的,这两个字符串aren't与用于初始化x
的字符串aren't相同,但是字符串连接是由编译器执行的,编译器意识到它是已经用于x
的相同字符串.