灵鹫宫

导航

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、值类型则是通过两个对象的相等性来进行判断。

posted on 2013-06-21 23:24  灵鹫宫  阅读(247)  评论(0)    收藏  举报