判断两个对象是否是同一个对象 | Equals | ReferenceEquals |== | string 类是一个特殊的类

来源:互联网 发布:小型图书馆源码 编辑:程序博客网 时间:2024/03/29 19:26

《1》

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 判断两个变量是否为同一个对象{    public class Person    {        public string Name { get; set; }        public int Age { get; set; }        public string Email { get; set; }    }    class Program    {        static void Main(string[] args)        {            Person p1 = new Person() { Name = "张三", Age = 20, Email = "123@qq.com" };            Person p2 = new Person() { Name = "张三", Age = 20, Email = "123@qq.com" };            //因为p1和p2都是各自new的对象。所以p1与p2并不是同一个对象,所以他们不“相等”            Console.WriteLine(p1 == p2);                 //输出:false            Console.WriteLine(p1.Equals(p2));            //输出:false            Console.WriteLine(ReferenceEquals(p1, p2));  //输出:false            //此时p1是指向p2的引用。所以,他们指向的内存都是同一块内存,所以他们“相等”            p1 = p2;            Console.WriteLine(p1 == p2);                 //输出:true            Console.WriteLine(p1.Equals(p2));            //输出:true            Console.WriteLine(ReferenceEquals(p1, p2));  //输出:true            //---------------下面我们来看一个特殊的类 string 字符串类----------------//            //其实此时的s1和s2都是指向同一块内存。所以他们“相等”            string s1 = "abc";            string s2 = "abc";            Console.WriteLine(s1 == s2);                  //输出:true            Console.WriteLine(s1.Equals(s2));             //输出:true            Console.WriteLine(ReferenceEquals(s1, s2));   //输出:true            //s3与s4是各自new的一个对象,所以他们是两块不同的内存 ........可是问题出现了,看下面的输出:            string s3 = new string(new char[] { 'a', 'b', 'c' });            string s4 = new string(new char[] { 'a', 'b', 'c' });            //对于string类来说,重载了Equals()方法,在这个重载方法中其实是判断两个字符串的字符是否完全一样,如果一样就返回true,并不是判断两个对象是否为同一个对象。            //并且sring类也重写了object类中的Equals方法,在该方法中也是判断的两个字符串中的字符串是否完全一样,如果一样就返回true,并不是判断两个对象是否为同一个对象。            //在字符串类中,有一个操作符重载,它是对==这个操作费进行了重载,在string类中 ==其实就是一个名字为==的方法 ,在这个方法中也是对字符串内容做了判断(其实在它里面也是调用的Equals方法)所以在string类中,==表现出了与Equals()方法同样的作用。            Console.WriteLine(s3 == s4);                  //输出:true              Console.WriteLine(s3.Equals(s4));             //输出:true             //总结:使用ReferenceEquals()始终可以准确的验证,两个变量是否指向同一个对象            Console.WriteLine(ReferenceEquals(s3, s4));   //输出:false            Console.ReadKey();        }    }}


原创粉丝点击