为什么C#中的对象比较工作起来很奇怪?

为什么C#中的对象比较工作起来很奇怪?,c#,comparison,string-comparison,C#,Comparison,String Comparison,当我比较两个类型为object且都包含相同值的变量时, 使用=运算符的比较结果产生false object Var1 = "X"; object Var2 = "X"; // This produces false result bool Match = Var1 == Var2; 为什么会这样 编辑:以上是实际工作的代码 我已经基于我的真实代码,看起来 这样做不起作用: ChoiceValue = Choice.GetValue(FieldTemplate.ValueDataType);

当我比较两个类型为
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
对象
,也是
字段。Value
是属性类型为
对象


显然,在不同的情况下,效果是不同的

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

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

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

你可以看到:

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

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


尝试
Var1.Equals(Var2)

运算符==将参考号与它们的值进行比较

(参考比较)

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

如果您的代码是:

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

bool Match = Var1 == Var2;
匹配将为true,因为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);
注意:此答案仅在字符串未被插入时有效。如果两个对象都被插入内存,它们将指向内存中的相同位置


希望这有助于理解.Net中的比较,因为它比较了对象的引用。最好的方法是重写
等于
或重载=运算符。

此特定案例返回false的原因是字符串未被插入。()

当我测试它的时候,我得到了正确的答案,因为我的琴弦被实习了

在您的例子中,这会导致object==操作符返回false,因为它通过引用进行比较

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

如果绝对必须使用对象变量,则可以使用
Equals
而不是
=
,或者可以使用

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


这在的文档中有解释。

请阅读有关引用类型和值类型以及它们的
Equals
方法的信息。我使用LINQPad:Truecheck的结果检查此链接。或者之所以如此,是因为
==
的行为是这样定义的。如果你想知道它为什么这样定义的话,这必须是有用的:最初的例子给出了真实的结果,我用真实的代码进行了编辑,给出了错误的结果以进一步说明:
((string)Var1)==((string)Var2)
将是
True
,否?我将操作代码复制到LINQPad中,并用
(Var1==Var2)替换最后一行。Dump();
…aa您得到了转储结果,这就是原因:)@KendallFrey:不要进行转储,然后看看会发生什么。@Nikhal:那么我就不会得到任何输出。结果应该是真的,因为“X”被插入,因此var1和var2指向同一个对象。如果字符串是动态生成的,并且两者的值都是“X”,那么结果应该是false,因为它(通常)是两个不同的对象。在OPs的情况下,它们应该是同一个对象,这就是为什么@kendallfrey得到了这个结果,而我没有否决它。我猜不管是谁做的,都是因为你发布了一个关于字符串比较而不是对象比较的链接?无论如何我会对此作出补偿:)我投了反对票,因为你提供的链接都不是OPs答案不正确的原因。肯德尔·弗雷说得对。(也是因为你没有回答问题,你只是列出了资源)但资源使用是否已满?你不应该知道原因吗?我在提供的资料中详细解释了这一点?我还提供了stachoverflow中已经提出的相关/类似问题的链接,不是很好吗?无论如何,谢谢您的回复。Var1和Var2将(在正常情况下)是同一个对象,因为字符串是internetd,它们都已经为字符串重载,因此调用可以解决问题,但是使用的
=
版本基于参数的编译时类型,而不是运行时类型,因此在这种特殊情况下,它不会影响结果
object Var1 = "X";
object Var2 = "X";

// This produces false result
bool Match = Var1.Equals(Var2);