繁体   English   中英

在 C# 中使用相等运算符

[英]Using equal operators in 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> (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); }

请参阅何时应该使用 == 以及何时应该使用 Equals? 准则实现equals和等号(= =) ,等等。就个人而言,我使用==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 语句中,您通常使用 == 检查相等性,= 运算符是赋值运算符,据我所知,c# 中没有 === 我从未听说过它,但它确实存在于其他语言中,我认为在 javascript 中它确实。

这太渴望发表评论了,所以我决定添加另一篇文章。

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

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

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

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

一个等号仅用于为变量赋值,赋值也将返回相同的值,因此 i 可以在 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

有关额外信息,不等于运算符是!=

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

我只在 javascript 中遇到过=== 这是那里的严格相等运算符。 我多次使用它if(obj === undefined){ alert("obj has sublimed");}

这个问题已经得到了回答,但我想在使用之间更深入地了解一些细节。

“=”是赋值运算符。 这用于为变量或对象分配一个(或多个)值。 这方面的一个例子是:

int abc;
abc = 5;
Console.WriteLine("Print: " + abc);
*Console Output* Print: 5

您不能在if语句中使用单个等号,因为代码会看到您尝试为对象分配一个值而不是比较两个值。

“==”是一个比较运算符。 这是在if语句中比较值的方式。 一个例子是:

int abc = 5;
int xyz = 10; //Notice the use of a single equal sign to assign the values
if (abc == xyz)
{
    Console.WriteLine("The values are equal");
}
else
{
    Console.WriteLine("The values are not equal");
}
*Console Output* The values are not equal

“===”在技术上被称为相同的比较运算符。 正如其他答案所述,C# 不允许进行这种比较。 不会的原因是因为相同的比较运算符正在检查两个对象类型是否相等以及它们的值。 本质上,它会检查是否:

double abc = 5;
int xyz = 5;
if (abc === xyz)
{
    Console.WriteLine("The values and variable types are equal");
}
*Console Output* Error

您不能使用“===”运算符的原因是因为 C# 足够聪明,可以在构建之前知道两个变量的类型不同,并且if语句要求您比较相同的变量类型。 如果您想比较intdouble ,则需要将其中一个变量转换(或解析)为与另一个相同的类型。 转换后,您将与常规的“==”运算符进行比较。

有许多语言确实允许您与相同的比较运算符进行比较。 JavaScript 是允许它的语言的一个很好的例子。 由于 JavaScript 中有很多变量可以声明为“var”类型,因此检查十进制值是否等于整数值是有益的。 但是,C# 会在构建期间甚至在编码期间(取决于您的 IDE)看到类型被错误地比较,并且在到达该代码段时会抛出错误或异常

===在 C# 编程语言中意味着根本不同的东西。 =是赋值运算符。 它用于为变量赋值。

变量是计算机内存中的桶,赋值运算符是用于告诉计算机将一些数据放入桶中的符号。

==是相等运算符,用于确定变量是否等于另一个变量。 ===是严格相等的运算符,它不仅检查桶中的内容是否相同,而且变量的类型也相同,例如...

如果您有一个等于 6 的整数变量和一个等于 6 的字符串,如果您使用==检查相等性,那么检查将给出布尔值 true,如果您使用=== ,它将给出一个假的。

这在弱类型编程语言中很有用,例如 JavaScript,其中隐式类型转换很常见,有时您需要在相等检查期间检查类型和值。

就像 C# 一样,你在声明变量时声明了类型,你不可能不知道,不知道变量类型是什么。 此外,C# 的 CLR 在它允许的类型转换方面非常严格,并且要发生这种类型转换,您必须显式转换它。 所有这些都在很大程度上使严格相等运算符变得多余。

在决策结构(如循环)中,您不会使用赋值运算符。 通常,在进行这些检查时,您的变量已经定义并填充了数据,您将使用相等运算符(以及其他)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM