[英]Why does object comparison in C# work strange?
当我比较两个类型为object
且都包含相同值的变量时,使用==
运算符的比较结果将生成false
。
object Var1 = "X";
object Var2 = "X";
// This produces false result
bool Match = Var1 == Var2;
为什么会这样呢?
编辑:上面是实际有效的代码!
我已经基于我的真实代码,它看起来像这样,无法正常工作:
ChoiceValue = Choice.GetValue(FieldTemplate.ValueDataType);
if (ChoiceValue == Field.Value) RadioButton.IsChecked = true;
ChoiceValue
是object
,并且Field.Value
也是键入为object
属性。
显然在不同情况下的工作方式有所不同。
此特定情况返回false的原因是因为您的字符串没有被实习 。 ( 字符串实习 )
当我测试它时,我是对的,因为我的弦被扣了。
在您的情况下,这会使对象==运算符返回false,因为它按引用进行比较 。
您的字符串没有被保留的原因是因为您正在比较动态生成的字符串(这意味着它们在编译时未知,但在运行时未知)。
如果绝对必须使用对象变量,则可以使用Equals
而不是==
,也可以使用String.Intern
手动插入字符串。
这种情况是引用类型的字符串异常,试图表现出类似值类型的行为。 这意味着,当使用字符串==运算符时,它们将按值进行比较。 但是,当您有对象时,它将使用对象==运算符,该运算符通过引用进行比较。
在string的文档中对此进行了说明。
在您编辑的问题中,您会遇到这种情况,因为==
比较引用而不是它们的值。
在使用字符串值的情况下,由于字符串内部操作,它似乎可以按预期工作。 在这里,您的Var1
和Var2
指向字符串“ X”的单个副本,并且由于==
比较引用,因此给出了真实的结果。
字符串实习。 这是一种存储任何字符串的副本的方法。
您可能会看到: 了解字符串实习
Why is this happening?
因为它匹配引用而不是它的值为false。
在字符串中==
比较它们的值。
试试Var1.Equals(Var2);
运算符==不会将参考值与其值进行比较。
(参考比较)
这意味着var1指向内存中的位置xxxx,而var2指向内存中的yyyy。 因此它们是不同的对象。
如果您的代码是:
object Var1 = "X";
object Var2 = Var1;
bool Match = Var1 == Var2;
匹配将为真,因为Var1和Var2都将指向内存中的xxxx,因此它们是同一对象。
(深度对象比较)
您可以使用Equals比较对象内部的值。 因此,当比较Var1(在xxxx位置)和Var2(在yyyy位置)时,如果碰巧它们都包含相同的值(在本例中为字母X),则它将返回true,否则返回false。 这样做的代码是:
object Var1 = "X";
object Var2 = "X";
// This produces false result
bool Match = Var1.Equals(Var2);
注意:此答案仅在不插入字符串时有效。 如果他们被扣留,则两个对象将指向内存中的相同位置
因为它比较对象的引用。 最好的方法是override
Equals
或重载==
运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.