.net高级技术——关于相等(Equals)

1.我们使用Object的ReferenceEquals方法来判断两个实列是否时相同的对象

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Age = 12;
            p1.Name = "wabc";
            Person p2 = new Person();
            p2.Name = "13";
            p2.Age = 12;
            Person p3 = p1;
            Console.WriteLine(object.ReferenceEquals(p1,p2));
            Console.WriteLine(object.ReferenceEquals(p1,p3));
            Console.WriteLine(object.ReferenceEquals(p2,p3));
            Console.ReadKey();
        }
    }
    class Person
    {
        public string Name { get;set;}
        public int Age { get; set; } 
    }

因为p2是创建的新的Person对象,和p1指向的对象是不同的对象,所以为False,但是Person p3 =p1;只是复制了一份引用,和p1指向同一个对象,所以为True,p2与p3是同样的原理。

下面我们来研究一下字符串的Equals方法

            string s1 = "testcode";
            string s2 = s1;
            string s3 = new string(new char[] { 't','e','s','t','c','o','d','e'});
            Console.WriteLine(s1.Equals(s2));
            Console.WriteLine(s1.Equals(s3));
            Console.WriteLine(s2.Equals(s3));

为什么全是True呢?

我们进行反编译或者VSF12转到定义发现,string类重写了Equals方法。

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), __DynamicallyInvokable]
public bool Equals(string value)
{
    if (this == null)
    {
        throw new NullReferenceException();
    }
    if (value == null)
    {
        return false;
    }
    if (this == value)
    {
        return true;
    }
    if (this.Length != value.Length)
    {
        return false;
    }
    return EqualsHelper(this, value);
}

 

 
 

 

上述代码是反编译出来的代码,在string类的Equals方法中只要两个字符串的值相等,就返回True,否则返回false.

下面我们也来重写一下我们Person类的Equals方法。

        public static  bool operator ==( Person left ,Person right)
        {
            return left.Name ==right.Name  && left.Age == right.Age;
        }
        public static bool operator !=(Person left, Person right)
        {
            return !left.Equals(right);
        }
    }

然后我们来测试一样我们能否像字符串那样用==来判断两个对象是否相等

            Console.WriteLine(p1==p2);
            Console.WriteLine(p1==p3);
            Console.WriteLine(p2==p3);

默认情况下==不是调用Equals方法,需要重载==运算符;

String等这些类是重写了Equals方法。

面试题:下面的代码有几个字符串对象

String s1 = "abc";

string s2 = s1;

string s3 = new String(new char[] {'a','b','c' });

Console.WriteLine(s1==s3);//输出true(虽然这里s1和s3不是同一个对象,但由于string重写了Equals方法,只要内容相等也返回true)

答案:两个字符串对象

---本博客是学习以后记录知识,如有侵权,请联系删除!!!

猜你喜欢

转载自blog.csdn.net/qq_33407246/article/details/88812385
今日推荐