比较C#里==与Equals()有何区别以及何时使用它们
作者:admin 时间:2023-6-12 17:12:35 浏览:为了比较变量之间的相等性,C# 提供了两种比较方法“==
”和重载方法“Equals()
”。大多数开发人员使用“==
”,而“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:引用类型比较
现在,当你比较对象时,它们是根据引用(内部内存指针)进行比较的。下面的 obj 和 obj1 通过“==
”或“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 | |
---|---|---|
使用 | 基于技术 | 基于业务 |
值类型 | 基于内容的比较 | 基于内容的比较 |
对象 | 基于参考的比较 | 基于参考的比较 |
字符串 | 基于内容的比较 | 基于内容的比较 |
内有内部的字符串 | 基于参考的比较 | 基于内容的比较 |
类型检查 | 编译时间 | 运行 |
空值 | 可用 | 崩溃 |
相关文章
- 站长推荐