System.Object
所有类型都是从System.Object继承;Object提供了几个公共是实例方法,
一、Equals
Equals主要是判断两个对象的具有相同的值,下面我们来看下几个例子。
static void Main(string[] args) { object obj1 = new object(); object obj2 = new object(); object obj3 = obj2; Console.WriteLine(obj1 == obj2); Console.WriteLine(obj2 == obj3); Console.Read(); }
输出结果:
False
True
这个是为什么呢?这里分别新建了两个对象,分别是obj1、obj2。而object是引用类型,obj1与obj2的引用地址也不同,而obj3实际引用的obj2,并未重新分配新的地址。从以上结果,Equals实现的实际是同一性(Identity).即两个对象实际上指的是同一个对象。
下面我们新建一个class
public class Person { public int Age { get; set; } }
并修改Main 方法如下
static void Main(string[] args) { Person p1 = new Person(); p1.Age = 28; Person p2 = new Person(); p2.Age = 28; Console.WriteLine(p1.Equals(p2)); Console.Read(); }
输出结构:
false
这个Person对象只有一个叫Age的属性。如果我要通过Age判断两个Person是否相等,我们可以直接使用p1.Age=p2.Age
即将
Console.WriteLine(p1.Equals(p2));
改造为
Console.WriteLine( p1.Age=p2.Age);
此时的输出结果为
True。
接下来我们继续改造Person为如下
public class Person { public int Age { get; set; } public int Gender { get; set; } }
并继续改造Main
static void Main(string[] args) { Person p1 = new Person(); p1.Age = 28; p1.Gender = 1; Person p2 = new Person(); p2.Age = 28; p2.Gender = 1; Person p3 = new Person(); p3.Age = 28; p3.Gender = 2; Console.WriteLine(p1.Equals(p2)); }
此时输出为仍然为false,如果需求指导我们 将 Age、Gender两个属性相等的对象默认为Equals,那么我们该如何操作呢?请继续往下看。
因为所有类型都是从System.Object继承,因此我们接下来将Person重写基类的 Equals方法。
public class Person { public int Age { get; set; } public int Gender { get; set; } public override bool Equals(object obj) { if (obj == null) return false; Person p = obj as Person; if (p == null) return false; return p.Age == this.Age && p.Gender == this.Gender; } }
此时,我们再执行如下代码
Console.WriteLine(p1.Equals(p2));
Console.WriteLine(p1.Equals(p3));
输出结果为
True
False
以上的Demo已经替我们验证了。引用类型的Equals实际实现的是同一性。如果要实现自定义的Equals,我们可以通过重写基类的Equals方法来自定义比较。
引用类型的Equals我们已经进行了验证,那么值类型的Equals是怎么样的呢?
我们继续修改Main方法
static void Main(string[] args) { int i = 0; int y = 0; int z = y; Console.WriteLine(i == y); Console.WriteLine(i.Equals(y)); Console.WriteLine(z == y); Console.Read(); }
此时输出结果为:
True
True
True
可以看出,值类型的Equals是通过相等性来进行比较的。接下来我们自定义一个值类型的。
struct Coordinate { public int X { get; set; } public int Y { get; set; } }
我们将Main改造如下
static void Main(string[] args) { Coordinate cd1 = new Coordinate { Y = 1, X = 2 }; Coordinate cd2 = new Coordinate { Y = 1, X = 2 }; Console.WriteLine(cd1.Equals(cd2)); Console.Read(); }
此时的输出结构为:
True
因为值类型判断的是对象的相等性。
通过以上我们总结如下
1、引用类型针对两个对象是否相等判断时,是判断两个对象是否指向同一个地址。如果不是同一地址,则两者不相同。即同一性判断。如果要重新定义,请重写基类的Equals
2、值类型则是通过两个对象的相等性来进行判断。
浙公网安备 33010602011771号