== vs C#中的等于
Posted
技术标签:
【中文标题】== vs C#中的等于【英文标题】:== vs Equals in C# 【发布时间】:2011-04-21 18:25:07 【问题描述】:C# 中 == 和 Equals 的求值有什么区别?
例如,
if(x==x++)//Always returns true
但是
if(x.Equals(x++))//Always returns false
已编辑:
int x=0;
int y=0;
if(x.Equals(y++))// Returns True
【问题讨论】:
@版主:在结束任何问题之前阅读完整的问题。如果您有权关闭任何问题,请在正确的地方使用它们。 @Jørn Schou-Rode,Arcturus,Oded,Pandiya Chendur,GregS:因为你们都投票结束了这个问题。请为我提供上述问题的正确答案或重新打开问题。 【参考方案1】:根据规范,这是预期行为。
第一个的行为受规范第 7.3 节的约束:
表达式中的操作数从左到右计算。例如,在
F(i) + G(i++) * H(i)
中,使用 i 的旧值调用方法 F,然后使用 i 的旧值调用方法 G,最后使用 i 的新值调用方法 H。这与运算符优先级分开且无关。
因此在x==x++
中,首先计算左侧操作数(0
),然后计算右侧操作数(0
,x
变为 1
),然后完成比较:@987654327 @ 是真的。
第二个的行为受第 7.5.5 节的约束:
如果 M 是在 value-type 中声明的实例函数成员: E 被评估。如果此评估导致异常,则不会执行进一步的步骤。 如果 E 未被归类为变量,则创建 E 类型的临时局部变量并将 E 的值分配给该变量。然后将 E 重新分类为对该临时局部变量的引用。临时变量可以在 M 中作为 this 访问,但不能以任何其他方式访问。因此,只有当 E 是一个真正的变量时,调用者才有可能观察到 M 对此所做的更改。 根据第 7.5.1 节中的描述评估参数列表。 M 被调用。 E引用的变量变成了this引用的变量。
请注意,值类型通过引用传递到它们自己的方法。
因此在x.Equals(x++)
中,首先评估目标(E 是x
,一个变量),然后评估参数(0
,x
变为1
),然后完成比较: x.Equals(0)
是假的。
编辑:我还想感谢 dtb 现已撤回的评论,该评论是在问题结束时发布的。我认为他在说同样的话,但是由于 cmets 的长度限制,他无法完全表达出来。
【讨论】:
【参考方案2】:评估顺序。 ++ 评估第一个(第二个示例)。但在第一个示例中, == 先执行。
【讨论】:
哇!我不敢相信我的眼睛......我会回复你 任何时候都可以......但输出将保持不变,即使你在一年后来......:) 我认为这个答案的总体思路是正确的,对于第二个和第三个例子: 1. Equals 的参数被评估,这将“保留” 0 作为值参数,但它也会将 x 增加 1。 2. 执行 Equals。如果 x=0,则 x.Equals(x++) 变为 1.Equals(0)。第一个示例和第二个示例之间的区别在于 == 在 x 本身设置为 x+1 之前执行。如果您重载结构上的运算符并进行调试,您会看到它实际上会在 == 之前进入 ++,但它不会对 ++ 的结果做任何事情,直到它出现的表达式被评估之后。 确切地说,这不是评估顺序。首先评估 Equals 方法的目标。但结果不是 x (0) 的值,而是 x 的地址,因为值类型上的方法接收“this”指针,而不是目标的值。以上是关于== vs C#中的等于的主要内容,如果未能解决你的问题,请参考以下文章
VS2010 Chart控件Chart控件在ASP.NET网站中的应用示例详解(C#语言)
是否可以使用 VS2010 分析器对 C# 中的主线程以外的线程进行采样