在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
和(大多数)结构类型(例如int
, Guid
)。
快乐的编码。
编辑:没有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 }