技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

比较C#里==与Equals()有何区别以及何时使用它们

作者:admin    时间:2023-6-12 17:12:35    浏览:

为了比较变量之间的相等性,C# 提供了两种比较方法“==”和重载方法“Equals()”。大多数开发人员使用“==”,而“Equals”几乎不被讨论。

因此,在这篇文章中,我们将讨论它们之间的区别以及何时使用什么。

比较C#里==与Equals()有何区别以及何时使用它们

第 1 点:平等基础上的比较

使用==Equals()进行相等比较没有区别,除非你在比较“String”比较。

通用比较规则:无论何时比较变量,它们要么是值类型,要么是引用类型。当比较值类型时,它们是在“内容”的基础上进行比较的;当比较引用类型时,它们是在“引用”(内存位置)而不是“内容”的基础上进行比较的。

==”和“Equals”都遵守上述规则。

场景 1:值类型比较

当你使用“==”或“Equals”比较值类型/原始数据类型(int、double 等)时,它始终基于内容。在下面的代码中,你可以看到两种比较方法都显示为“true”。

int i = 10;
int y = 10;
Console.WriteLine(i == y); // true
Console.WriteLine(i.Equals(y)); // true

场景 2:引用类型比较

现在,当你比较对象时,它们是根据引用(内部内存指针)进行比较的。下面的 objobj1 通过“==”或“Equals”进行比较都将为false。所以在下面的代码中,即使两个对象的属性名称都是“Shiv”,它仍然显示不相等。因为比较是基于内存引用的,这对于“obj”和“obj1”是不同的。

Customer obj = new Customer();
obj.Name = "Shiv";
Customer obj1 = new Customer();
obj1.Name = "Shiv";
Console.WriteLine(obj == obj1); // false
Console.WriteLine(obj.Equals(obj1)); // false

但是下面的代码将显示为 true,因为指针指向同一个对象。

Customer obj = new Customer();
obj.Name = "Shiv";
Customer obj1 = obj;
Console.WriteLine(obj == obj1); // true
Console.WriteLine(obj.Equals(obj1)); // true

场景 3:字符串比较和对象类型转换

现在字符串是不可变对象或引用类型,因此应使用引用类型规则检查它们。换句话说,在下面的场景中,当我们将值赋给“str”时,它会创建一个字符串对象,并且在堆中存储了“test”。当你现在为“str1”分配一个不同的对象时,它应该是一个不同的实例。

但是看看值,它是一样的。所以C#字符串遵循内部规则。换句话说,如果内容是相同的“str”和“str1”,它们指向相同的内存位置和数据。所以“==”和“Equals”都为true

object str = "test";
object str1 = "test";
Console.WriteLine(str==str1);
Console.WriteLine(str.Equals(str1));

但是现在看看下面的代码,我们在其中显式地创建了具有相同值的新的独立字符串对象。我们正在强制和覆盖字符串的内部行为。在下面的代码中,“==”将返回 false,即使内容相同,而“Equals”将返回 true。这是等号不同的地方。

object str = new string(newchar[] { 't', 'e', 's', 't' });
object str1 = new string(newchar[] { 't', 'e', 's', 't' });
Console.WriteLine(str==str1); // false
Console.WriteLine(str.Equals(str1));  // true

第 2 点:编译时 VS 运行时

使它们不同的下一点是何时进行类型检查。“==”在编译时进行类型检查,而“Equals”更多是在运行时进行。你可以在下面的代码中看到“==”如何显示带有绿色标志的警告消息,表明你正在比较不同的类型并且可能会遇到问题。“Equals”不显示任何此类警告。

 

第 3 点:NULL 情况

==”适用于空值,但“Equals”在你比较 NULL 值时崩溃,请参见下面的打印屏幕。

 

何时使用什么:技术比较 VS 语义比较

==”是 C# 运算符,而“Equals”是多态方法。所以换句话说,“==”是一种语言特性,而“Equals”是一种遵循多态性的面向对象编程特性。

现在比较有两种类型,一种是纯粹基于内容和引用,即基于计算机的比较,另一种是基于语义。语义是指事物的实际含义。例如 1 <> 70 在数字上(技术上)但在现实世界中在语义上 1 $ = 70 Rs 。

更多示例:

  • 从技术上讲: 1 等于 1。
  • 语义上:-1 美元不等于 1 卢比。
  • 从技术上讲:“目的地”一词不等于“最后一站”。
  • 语义上:-“目的地”与“最后一站”的含义相同。

因此,技术比较是基于计算机的,而语义比较是基于业务的,或者我们可以说存在某种用于比较目的的域规则。

那么现在什么时候使用“==”,什么时候使用“Equals”:

如果你正在寻找技术比较,那么使用“==”,大多数时候“==”就足够了,因为开发人员主要进行技术比较。

如果你在语义上进行比较,那么你需要在“Equals”上使用语义比较逻辑,并且你需要在比较时使用“Equals”方法。

概括

所以如果我们把所有的点都列出来,最后的结论就是下表。 

  == Equals
使用 基于技术 基于业务
值类型 基于内容的比较 基于内容的比较
对象 基于参考的比较 基于参考的比较
字符串 基于内容的比较 基于内容的比较
内有内部的字符串 基于参考的比较 基于内容的比较
类型检查 编译时间 运行
空值 可用 崩溃

相关文章

标签: ==运算符  Equals方法  CSharp  
x
  • 站长推荐
/* 左侧显示文章内容目录 */