为什么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,因为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);
注意:此答案仅在字符串未被插入时有效。如果两个对象都被插入内存,它们将指向内存中的相同位置
希望这有助于理解.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);