看这段代码:
object x = "mehdi emrani";
string y = "mehdi emrani";
Console.WriteLine(y == x);
返回true
.
但是这段代码:
object x = "mehdi emrani";
string y = "mehdi ";
y += "emrani";
Console.WriteLine(y == x);
returns false
.
因此,当我在第一个代码中比较 String 和 Object 时,我得到true
.
但是当我在第二个代码中比较它们时我得到false
.
两个字符串相同,但为什么当我附加到字符串时,结果返回false
?
在每种情况下,第二个操作数==
is x
,其类型为object
。这意味着您正在使用普通的引用相等运算符。
现在,在第一种情况下,您使用两个字符串常量具有相同的内容。 C# 编译器将为这两个引用使用单个对象。在第二种情况下,x
and y
引用具有相同内容的不同字符串对象。两个引用会不同,所以==
将返回 false。
您可以通过以下方式修复比较:
-
Use Equals
相反 - 那是被覆盖 by string
(相对于==
运算符仅超载:
Console.WriteLine(y.Equals(x)); // or x.Equals(y), or Equals(y, x)
静态的使用Equals(object, object)
如果任一参数可以为 null,则该方法可能很有用;这意味着您无需担心NullReferenceException
.
将两个变量设置为类型string
,此时==
内过载string
将在编译时选择,并且该重载会比较字符串的内容,而不仅仅是引用
值得注意的是,C# 编译器注意到的不仅仅是字符串文字本身的问题,还涉及编译时常量表达式。例如:
object x = "mehdi emrani";
string y = "mehdi " + "emrani";
Console.WriteLine(y == x); // True
Here y
使用两个字符串文字初始化aren't与初始化时使用的相同x
,但字符串连接是由编译器执行的,编译器意识到它与已使用的字符串相同x
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)