Equals和==比較

总结一下:

            对于字符串来说。两个比較的都是对象的值,而且是等效的,这是由于MS重写了==运算符和Equals方法所致
            对于非字符串的其它引用类型(非匿名类型)两个比較的都是对象的引用。而且是等效的;
            对于匿名类型,Equal()方法比較的是类型的状态,假设两个类型的属性和值都同样,就返回true;==比較的是对象的引用。


           对于判断类型(弱化类型、隐式类型),假设编译器判断为引用类型,则两个比較的都是对象的引用,而且是等效的,假设判断为值类型,则也是等效的。

    public class 鸡
    {
        public int 身高;
        public int 体重;
        public int 三围;
        public 鸡(int _身高, int _体重, int _三围)
        {
            身高 = _身高;
            体重 = _体重;
            三围 = _三围;
        }

        public 鸡()
        {

        }
        public override string ToString()
        {
            return string.Format("身高:{0}。体重:{1},三围:{2}", 身高, 体重, 三围);
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            //值类型是存储在栈上,编译时分配内存
            Console.WriteLine("值类型測试——————");
            int a = 1;
            int b = 1;
            Console.WriteLine(string.Format("a={0},b={1}", a, b));
            Console.WriteLine(a.Equals(b));//ture
            Console.WriteLine(a == b);//ture

            b = 2;
            Console.WriteLine(string.Format("a={0},b={1}", a, b));
            Console.WriteLine(a.Equals(b));//false
            Console.WriteLine(a == b);//false

            a = 1;
            b = 1;
            int temp_b = b;
            Console.WriteLine(string.Format("a={0},temp_b={1}", a, temp_b));
            Console.WriteLine(a.Equals(temp_b));//ture
            Console.WriteLine(a == temp_b);//ture

            Console.WriteLine(string.Format("temp_b={0},b={1}", temp_b, b));
            Console.WriteLine(temp_b.Equals(b));//ture
            Console.WriteLine(temp_b == b);//ture



            //引用类型是存储在堆上,执行时分配内存
            Console.WriteLine("引用类型測试——————");
            鸡 xiao = new 鸡(1, 1, 1);
            鸡 da = new 鸡(1, 1, 1);
            Console.WriteLine(string.Format("xiao={0},da={1}", xiao, da));

            Console.WriteLine(xiao.Equals(da));//false
            Console.WriteLine(xiao == da);//false
            


            da = new 鸡(100, 100, 100);
            Console.WriteLine(string.Format("xiao={0},da={1}", xiao, da));
            Console.WriteLine(xiao.Equals(da));//false
            Console.WriteLine(xiao == da);//false

            Console.WriteLine(string.Format("xiao和da是分配在不同堆上的,在内存中的地址不一样,Equals和==比較的是内存中的引用地址。"));

            鸡 zhong = da;
            Console.WriteLine(string.Format("zhong={0},da={1}", zhong, da));
            Console.WriteLine(zhong.Equals(da));//ture
            Console.WriteLine(zhong == da);//ture
            Console.WriteLine("zhong指向da,所以引用的地址一样。故他们使用Equals和==是相等的");
            Console.WriteLine("总结:对于非字符串类型的引用类型,这两种符号比較的都是变量的引用,并非值.");




            Console.WriteLine("string特殊引用类型測试——————");
            string c = "1";
            string d = "1";
            Console.WriteLine(string.Format("c={0},d={1}", c, d));

            Console.WriteLine(c.Equals(d));//ture
            Console.WriteLine(c == d);//ture

            c = "2";
            Console.WriteLine(string.Format("c={0},d={1}", c, d));
            Console.WriteLine(c.Equals(d));//false
            Console.WriteLine(c == d);//false

            string e = d;
            Console.WriteLine(string.Format("e={0},d={1}", e, d));
            Console.WriteLine(e.Equals(d));//ture
            Console.WriteLine(e == d);//ture

            Console.WriteLine("匿名类型測试——————");





            var v11 = new { 身高 = 10, 体重 = 10, 三围 = 10};
            var w11 = new { 身高 = 10, 体重 = 10, 三围 = 10};

            Console.WriteLine(string.Format("v11={0},w11={1}", v11, w11));
            Console.WriteLine(v11.Equals(w11));//ture
            Console.WriteLine(v11 == w11);//false

            var v1 = new { 身高 = 10, 体重 = 10, 三围 = 10, 年龄=100 };
            var w1 = new { 身高 = 10, 体重 = 10, 三围 = 10, 年龄 = 100 };

            Console.WriteLine(string.Format("v1={0},w1={1}", v1, w1));
            Console.WriteLine(v1.Equals(w1));//ture
            Console.WriteLine(v1 == w1);//false


            Console.WriteLine("判断类型(弱化类型、隐式类型)測试——————");

            var v = 1;
            var w = 1;
            Console.WriteLine(string.Format("v={0},w={1}", v, w));
            Console.WriteLine(v.Equals(w));//ture
            Console.WriteLine(v == w);//ture

            var vv = new 鸡();
            var ww = new 鸡();
            vv.三围 = 10;
            vv.身高 = 10;
            vv.体重 = 10;

            ww.三围 = 10;
            ww.身高 = 10;
            ww.体重 = 10;
            Console.WriteLine(string.Format("vv={0},ww={1}", vv, ww));
            Console.WriteLine(vv.Equals(ww));//false
            Console.WriteLine(vv == ww);//false


            vv = new 鸡(100,100,100);
            ww = new 鸡(100, 100, 100);
            Console.WriteLine(string.Format("vv={0},ww={1}", vv, ww));
            Console.WriteLine(vv.Equals(ww));//false
            Console.WriteLine(vv == ww);//false


            Console.WriteLine("对于字符串来说,两个比較的都是对象的值。而且是等效的,这是由于MS重写了==运算符和Equals方法所致");
            Console.WriteLine();
            Console.WriteLine("对于非字符串的其它引用类型(非匿名类型)两个比較的都是对象的引用,而且是等效的");
            Console.WriteLine();
            Console.WriteLine("对于匿名类型,Equal()方法比較的是类型的状态,假设两个类型的属性和值都同样,就返回true。==比較的是对象的引用。");
            Console.WriteLine();
            Console.WriteLine("对于判断类型(弱化类型、隐式类型),假设编译器判断为引用类型,则两个比較的都是对象的引用,而且是等效的,假设判断为值类型,则也是等效的。");
            Console.WriteLine();

            Console.ReadKey();
            //对于字符串来说。两个比較的都是对象的值,而且是等效的,这是由于MS重写了==运算符和Equals方法所致
            //对于非字符串的其它引用类型(非匿名类型)两个比較的都是对象的引用。而且是等效的。
            //对于匿名类型。Equal()方法比較的是类型的状态。假设两个类型的属性和值都同样。就返回true;==比較的是对象的引用。
            //对于判断类型(弱化类型、隐式类型)。假设编译器判断为引用类型,则两个比較的都是对象的引用。而且是等效的。假设判断为值类型。则也是等效的。

        }
    }


 

原文地址:https://www.cnblogs.com/gccbuaa/p/7047579.html