C#值类型、引用类型中的Equals和==的区别浅析
相关概念
在讨论 Equals
和 ==
的区别之前,我们先来了解一下 C# 中两种常见的数据类型:值类型和引用类型。
值类型
值类型指的是简单的数据类型,如 int
、double
、char
等等。值类型的数据在赋值和传递时,始终是复制一份数据,而不是像引用类型那样复制一份指向数据的指针。
int a = 1;
int b = a;
以上代码中,第二行的赋值操作不会影响第一行的变量 a
,因为 int
是一个值类型,所以 b
将完全复制 a
中的值。
引用类型
引用类型则是指向某个对象的引用,而不是该对象本身。常见的引用类型包括 string
和自定义的类、接口等等。引用类型的数据在赋值和传递时,实际上是复制了一份指向同一个对象的引用,而不是复制了一个新的对象。
string s1 = "hello";
string s2 = s1;
以上代码中,第二行的赋值操作将使 s2
引用与 s1
引用指向同一个 string
对象。如果修改了 s2
的值,则实际上也会修改 s1
对应的字符串。
Equals 和 == 的区别
值类型中的 Equals 和 ==
在值类型中,Equals
和 ==
的作用是类似的,都是用来比较值是否相等的。区别在于:
Equals
可以被重写,而==
操作符不行Equals
需要一个对象作为参数,而==
操作符可以直接比较两个值类型的值
int a = 1;
int b = 2;
bool equal1 = a.Equals(b); // false
bool equal2 = (a == b); // false
// 重写 Equals 方法
struct MyStruct
{
public int X;
public int Y;
public override bool Equals(object obj)
{
if (obj is MyStruct)
{
MyStruct other = (MyStruct)obj;
return (this.X == other.X && this.Y == other.Y);
}
return false;
}
}
MyStruct s1 = new MyStruct { X = 1, Y = 2 };
MyStruct s2 = new MyStruct { X = 1, Y = 2 };
bool equal3 = s1.Equals(s2); // true
bool equal4 = (s1 == s2); // false,因为 MyStruct 没有重载 == 操作符
引用类型中的 Equals 和 ==
在引用类型中,Equals
和 ==
的作用不一样了:
Equals
用于判断两个对象的值是否相等==
用于判断两个对象的引用是否相等
换句话说,如果想比较引用类型的值是否相等,应该使用 Equals
方法;如果想比较两个引用类型的对象是否是同一个对象,应该使用 ==
操作符。
string s1 = "hello";
string s2 = "HELLO".ToLower();
bool equal1 = s1.Equals(s2); // true,因为两个字符串的值相等
bool equal2 = (s1 == s2); // false,因为 s1 和 s2 引用的不是同一个字符串对象
示例
示例一:对象引用为 null
string s1 = null;
string s2 = null;
bool equal1 = s1.Equals(s2); // 抛出 NullReferenceException 异常
bool equal2 = (s1 == s2); // true
以上代码中,由于 s1
和 s2
引用都为 null
,因此使用 s1.Equals(s2)
方法时会抛出 NullReferenceException
异常。但是,s1 == s2
会返回 true
,因为两个引用都是 null
。
示例二:自定义类重载 Equals 方法
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override bool Equals(object obj)
{
if (obj is Person)
{
Person other = (Person)obj;
return (this.Name == other.Name && this.Age == other.Age);
}
return false;
}
}
Person p1 = new Person { Name = "Alice", Age = 25 };
Person p2 = new Person { Name = "Alice", Age = 25 };
bool equal1 = p1.Equals(p2); // true
bool equal2 = (p1 == p2); // false
以上代码中,自定义了一个 Person
类,并重载了它的 Equals
方法,用于比较两个 Person
对象的值是否相等。在比较 p1
和 p2
时,通过 p1.Equals(p2)
方法可以正确地判断两个对象的值是否相等。但是,p1 == p2
操作符却会返回 false
,因为 Person
类没有重载 ==
操作符。如果需要使 ==
操作符可以比较两个 Person
对象的值是否相等,还需要在 Person
类中定义相应的 ==
操作符重载方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#值类型、引用类型中的Equals和==的区别浅析 - Python技术站