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

sub*_*nki 11 c#

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

ten*_*nor 24

=是分配,就像在

var i = 5;
Run Code Online (Sandbox Code Playgroud)

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

==用于比较

if(i == 6){...}
Run Code Online (Sandbox Code Playgroud)

C#中没有===运算符

  • 没有警告只是一个错误,i = 5将被评估,我将被赋值5并返回5,因为5不是布尔值(true/false)if语句是非法的,你将得到编译错误. (3认同)
  • 当您尝试编译该代码时,C#足够聪明地警告您.它应该是if(i == 5){x = 10;}编辑:澄清 (2认同)

小智 12

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

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

例如:

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

虚拟方法,在另一方面,被限定在,因此是在所有子类型的多态.Equals object

object a = Guid.NewGuid();
object b = new Guid(""+a);
a.Equals(b) // true -- uses Guid.Equals
Run Code Online (Sandbox Code Playgroud)

选择使用哪种(==Equals)有时是微妙的 - 但很重要.大多数集合类型将Equals用于诸如此类的任务Contains.(这对于所有通用容器几乎都是必需的,因为T.==对于任意类型都没有T.)

// compile-time error: Operator '==' cannot be applied to operands of type 'T' and 'T'
bool equals<T> (T a, T b) { return a == b; }

// fair-game, because object defines Equals and it's polymorphic to subtypes
bool equals<T> (T a, T b) { return a.Equals(b); }
Run Code Online (Sandbox Code Playgroud)

我什么时候应该使用==什么时候应该使用Equals?实施等于和等于运算符的指南(==)等.就个人而言,我使用==Equals是静态可解析的具体类型,其==定义明确,我不会(通过合同或惯例)处理子类型 - 示例是string与(最)结构类型(例如int,Guid).

快乐的编码.

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

bool trippleEquals (object a, object b) {
  return a.GetType() == b.GetType() && a.Equals(b);
}
Run Code Online (Sandbox Code Playgroud)

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

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