zoukankan      html  css  js  c++  java
  • 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;==比較的是对象的引用。
                //对于判断类型(弱化类型、隐式类型)。假设编译器判断为引用类型,则两个比較的都是对象的引用。而且是等效的。假设判断为值类型。则也是等效的。
    
            }
        }


     

  • 相关阅读:
    禁止页面被复制和禁止右键,一段样式一段JS就行了,无需复杂设定!
    你不知道的DIV+CSS的命名规则
    帝国cms提高网站网页打开速度的手段
    帝国cms网站管理系统之安全设置最优化分享
    渗透测试===使用BURPSUIT暴力破解某网站的手机验证码
    并发、并行、同步、异步、多线程的区别?
    python基础===一行 Python 代码实现并行(转)
    python目前安装的包备份
    jmeter,测登录,要不要过滤掉JS,CSS等请求?感觉过滤掉了压出来的数据就不真实?
    几个网站
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7047579.html
Copyright © 2011-2022 走看看