在C#中使用相等的运算符

在If语句中何时应该使用=,==运算符。 有没有===运营商? 这些运营商有什么区别?

=是分配,就像在

var i = 5; 

不要在if语句中使用此运算符。

==用于比较

 if(i == 6){...} 

C#中没有===运算符

(以下是一些“评论”,但是在评论中太长,并且会在本文中与其他评论一起丢失。)

在C# == (与C#中的所有运算符一样)是非多态的。 也就是说,被调用的==的“版本”总是基于编译时的静态类型。

例如:

 object a = Guid.NewGuid(); object b = new Guid(""+a); a == b // false -- uses object.== -- an *identity* compare 

另一方面, Equals 虚方法是在object上定义的,因此在所有子类型中都是多态的。

 object a = Guid.NewGuid(); object b = new Guid(""+a); a.Equals(b) // true -- uses Guid.Equals 

选择使用哪一个( ==Equals )有时是微妙的 – 但很重要。 大多数集合类型将使用Equals来执行Contains等任务。(对于所有通用容器,这几乎都是必需的,因为对于任意类型T没有T.== 。)

 // compile-time error: Operator '==' cannot be applied to operands of type 'T' and 'T' bool equals (T a, T b) { return a == b; } // fair-game, because object defines Equals and it's polymorphic to subtypes bool equals (T a, T b) { return a.Equals(b); } 

看我何时应该使用==以及何时应该使用Equals? 个人使用== over Equals进行静态可解析的具体类型,其中==是明确定义的,我不会 (通过合同或约定)处理子类型 – 示例是string和(大多数)结构类型(例如intGuid )。

快乐的编码。

编辑:没有C# ===运算符(正如人们所说,呃!)。 如果谈论JavaScript变体,它将是大约:

 bool trippleEquals (object a, object b) { return a.GetType() == b.GetType() && a.Equals(b); } 

(它在JavaScript中是严格的相等 – 但不是对象标识 )。

如果谈论对象标识,那么它应该与(object)a == (object)b相同,它具有与object.ReferenceEquals(a,b)相同的语义。

单个=用于赋值,如:

 String myString = "Hi There"; 

双重等于用于比较

 if (5 == 5) { do something } 

某些语言中的三等于完全相等。

C#不使用该运算符。

除了其他答案, ReferenceEquals(x,y)可能是最接近===东西。

在if语句中,你通常使用==检查是否相等,=运算符是assignemt运算符,据我所知,c#中没有===我从来没有听说过它但它确实存在于其他语言中我认为在javascript中它确实。

一个等号仅用于为变量赋值,赋值也将返回相同的值,因此我可以在if语句中使用但不应该(几乎……)在if语句中使用。 双等号用于测试两个值是否相等,是大多数时候使用的值。 我不知道一个===运算符。

/维克托

=是一个赋值运算符
==比较运算符

例:

 int a=2; int b=3; int c=a=b; // a, b, c is equal to 3 as b=3 

 int a=2; int b=3; bool c= a==b // c = false since result of a==b is false 

有关额外信息,Not Equal运算符是!=

有关C#运算符的更多信息: http : //msdn.microsoft.com/en-us/library/6a71f45d%28v=VS.100%29.aspx

我只是在javascript中遇到了=== 。 它是那里严格的平等运营商。 if(obj === undefined){ alert("obj has sublimed");}我曾多次使用它

这是一个很好的评论,所以我决定添加另一篇文章。

我将var变量设置为对象列表,并对总是失败的比较逻辑的两个变量进行比较:

  object Object1; object Object2; var v1 = Object1; var v2 = Object2; if (v1 != v2) { // Do something } 

感谢这个post中的post,我改变了逻辑如下,现在它完美地工作:

  object Object1; object Object2; var v1 = Object1; var v2 = Object2; if (!v1.Equals(v2)) { // Do something }