0

当我比较两个类型为 asobject且都包含相同值的变量时,使用==运算符的比较结果会产生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;

ChoiceValueisobjectField.Valueis 属性类型为object.

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

4

6 回答 6

9

这种特定情况返回 false 的原因是因为您的字符串没有被 interned。(字符串实习

当我测试它时,我得到了正确的结果,因为我的琴弦被扣留了。

在您的情况下,这会导致 object == 运算符返回 false,因为它通过引用进行比较

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

如果您绝对必须使用对象变量,您可以使用Equals而不是==,或者您可以手动实习字符串String.Intern

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

这在string的文档中进行了解释。

于 2012-07-02T12:37:02.450 回答
7

在您编辑的问题中,您会得到这种行为,因为==比较的是参考而不是它们的值。

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

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

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

在此处输入图像描述

于 2012-07-02T12:29:12.123 回答
0
Why is this happening?

因为它匹配参考而不是它的值为假的。

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

尝试Var1.Equals(Var2);

于 2012-07-02T12:30:11.777 回答
0

运算符 == 比较参考和它们的值。

(参考比较)

这意味着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);

注意:此答案仅适用于未保留字符串的情况。如果他们被实习,两个对象将指向内存中的相同位置

于 2012-07-02T12:31:28.907 回答
0

阅读更多相关信息:

C#中字符串比较方法的区别

C# 对象比较

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

希望这有助于理解 .Net 中的比较

于 2012-07-02T12:31:47.327 回答
0

因为它比较对象的引用。最好的方法是override Equals重载==运算符。

于 2012-07-02T12:32:46.033 回答