6.CSharp中双等于运算符和Equals的区别
6.1 题目
请说说你认为C#中 == 和 Equals 的区别是什么?
6.2 深入解析
在C#中,== 和 Equals 是用于比较对象的两种不同方式。
定义和重写:
==是一个运算符,用于比较两个操作数。Equals是Object类中的虚方法,可以在子类中重写。
比较方式:
Equals方法一般用于比较两个对象的内容是否相同。默认情况下,Object类中的Equals方法比较对象的引用,即判断两个对象是否是同一个实例。子类可以重写Equals方法以实现特定的比较逻辑。==对值类型通常比较按位值;对引用类型默认比较引用,但部分类型(如string)重载了==,行为与内容比较一致。
运算效率:
- 一般情况下,
Equals方法的效率没有==运算符高,因为Equals方法通常会进行更多的比较操作。尤其是在子类中重写Equals方法时,可能会比较对象的各个字段,而==运算符通常进行简单的引用或值比较。
- 一般情况下,
示例代码
using System;
class Program
{
static void Main()
{
// 示例1:值类型比较
int a = 5;
int b = 5;
Console.WriteLine(a == b); // 输出:True
Console.WriteLine(a.Equals(b)); // 输出:True
// 示例2:string 的 == 已重载为按内容比较(与 Equals 一致)
string str1 = new string(new[] { 'h', 'e', 'l', 'l', 'o' });
string str2 = new string(new[] { 'h', 'e', 'l', 'l', 'o' });
Console.WriteLine(str1 == str2); // True(内容相同)
Console.WriteLine(str1.Equals(str2)); // True
// 引用是否同一实例用 ReferenceEquals
Console.WriteLine(object.ReferenceEquals(str1, str2)); // 通常为 False
// 示例3:自定义类比较
MyClass obj1 = new MyClass(1, "example");
MyClass obj2 = new MyClass(1, "example");
Console.WriteLine(obj1 == obj2); // 输出:False,因为==比较的是引用地址
Console.WriteLine(obj1.Equals(obj2)); // 输出:True,因为重写的Equals方法比较的是内容
}
}
class MyClass
{
public int Id { get; }
public string Name { get; }
public MyClass(int id, string name)
{
Id = id;
Name = name;
}
public override bool Equals(object obj)
{
if (obj is MyClass other)
{
return Id == other.Id && Name == other.Name;
}
return false;
}
public override int GetHashCode()
{
return Id.GetHashCode() ^ Name.GetHashCode();
}
}
总结
定义和重写:
==是运算符,Equals是Object类中的虚方法,子类可以重写。
比较方式:
Equals方法通常用于比较对象的内容,==运算符用于比较引用类型的地址或值类型的值。
运算效率:
==运算符通常比Equals方法效率高,因为Equals方法可能涉及更多的比较操作。
6.3 答题示例
“
==对值类型比较值;对引用类型默认比较引用,但string等类型重载了==,按内容比较。Equals为虚方法,默认引用相等,子类常重写为值相等;重写Equals时需同步GetHashCode。”
6.4 关键词联想
==运算符- 值类型:值比较
- 引用类型:地址比较
- 可重载
Equals方法- 虚方法
- 内容比较
- 重写 &
GetHashCode
性能考量
- 运算符更高效
- 方法可能更复杂
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com