繁体   English   中英

为什么C#中的对象比较奇怪?

[英]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;

ChoiceValueobject ,并且Field.Value也是键入为object属性。

显然在不同情况下的工作方式有所不同。

此特定情况返回false的原因是因为您的字符串没有被实习 字符串实习

当我测试它时,我是对的,因为我的弦被扣了。

在您的情况下,这会使对象==运算符返回false,因为它按引用进行比较

您的字符串没有被保留的原因是因为您正在比较动态生成的字符串(这意味着它们在编译时未知,但在运行时未知)。

如果绝对必须使用对象变量,则可以使用Equals而不是== ,也可以使用String.Intern手动插入字符串。

这种情况是引用类型的字符串异常,试图表现出类似值类型的行为。 这意味着,当使用字符串==运算符时,它们将按值进行比较。 但是,当您有对象时,它将使用对象==运算符,该运算符通过引用进行比较。

string的文档中对此进行了说明。

在您编辑的问题中,您会遇到这种情况,因为==比较引用而不是它们的值。

在使用字符串值的情况下,由于字符串内部操作,它似乎可以按预期工作。 在这里,您的Var1Var2指向字符串“ X”的单个副本,并且由于==比较引用,因此给出了真实的结果。

字符串实习。 这是一种存储任何字符串的副本的方法。

您可能会看到: 了解字符串实习

在此处输入图片说明

Why is this happening?

因为它匹配引用而不是它的值为false。

在字符串中==比较它们的值。

试试Var1.Equals(Var2);

运算符==不会将参考值与其值进行比较。

(参考比较)

这意味着var1指向内存中的位置xxxx,而var2指向内存中的yyyy。 因此它们是不同的对象。

如果您的代码是:

object Var1 = "X";
object Var2 = Var1;

bool Match = Var1 == Var2;

匹配将为真,因为Var1Var2都将指向内存中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM