zoukankan      html  css  js  c++  java
  • C#对象比较的总结

     简单整型比较:

    从这里可以看出整型比较无论是==和Equals方法都是进行比较,比较“正常”

                int m1 = 2;
                int m2 = 2;
    
                Console.WriteLine(m1 == m2);//值比较True
                Console.WriteLine(m1.Equals(m2));//值比较True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False

    object比较:

    类型如果是Object,进行==比较时判断的是地址是否相同,而Equals则是其虚方法判断值是否正常

                object m1 = 2;
                object m2 = 2;
    
                Console.WriteLine(m1 == m2);//引用类型引用比较False
                Console.WriteLine(m1.Equals(m2));//Object虚方法值比较True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False

    整型赋值比较:

    这个就类似浅拷贝

                int m1 = 3434;
                int m2 = m1;
    
                Console.WriteLine(m1 == m2);//值比较True
                Console.WriteLine(m1.Equals(m2));//值比较True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用比较False

    object和其他值类型比较:

                object m1 = 2;
                int m2 = 2;
    
                Console.WriteLine(m1.Equals(m2));//Object虚方法值比较True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False

    字符串类型比较:

    字符串虽然是引用类型,但是C#对其做有特殊优化,从下面的结果就可以看出,==和Equals比较的是字符串内容相同,而字符串内容相同的两个变量引用也相同,是经过运行时优化了的。

                string m1 = "tg903eiotf38";
                string m2 = "tg903eiotf38";
    
                Console.WriteLine(m1 == m2);//字符串值比较True
                Console.WriteLine(m1.Equals(m2));//字符串值比较True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//字符串引用优化比较True

    现有一class:

           public class Student
            {
                public long Id { get; set; }
    
                public string Name { get; set; }
            }

    引用类型比较:

    简单的引用类型,==和Equals比较的是都是地址引用

           Student m1 = new Student()
                {
                    Id = 34,
                    Name = "朝野布告",
                };
                Student m2 = new Student()
                {
                    Id = 34,
                    Name = "朝野布告",
                };
    
                Console.WriteLine(m1 == m2);//False
                Console.WriteLine(m1.Equals(m2));//False
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//False
                Student m1 = new Student()
                {
                    Id = 34,
                    Name = "朝野布告",
                };
                Student m2 = m1;
    
                Console.WriteLine(m1 == m2);//True
                Console.WriteLine(m1.Equals(m2));//True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True

    引用类型赋值比较:

    类似浅拷贝

                Student m1 = new Student()
                {
                    Id = 34,
                    Name = "朝野布告",
                };
                Student m2 = m1;
    
                m1.Name = "飓风";
    
                Console.WriteLine(m1 == m2);//True
                Console.WriteLine(m1.Equals(m2));//True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True
                Console.WriteLine(m1.Name);//飓风
                Console.WriteLine(m2.Name);//飓风
                object m1 = new Student()
                {
                    Id = 34,
                    Name = "朝野布告",
                };
                object m2 = m1;
                
                Console.WriteLine(m1 == m2);//True
                Console.WriteLine(m1.Equals(m2));//True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True

    匿名类型比较:

    匿名类型==比较的是地址的引用,而哈希码的生成看的是每个数据成员的值,因此其全部值一样则哈希码一样,Equals判断也一样的道理

                var m1 = new { Id = 34, Name = "朝野布告" };
                var m2 = new { Id = 34, Name = "朝野布告" };
    
                Console.WriteLine(m1 == m2);//False
                Console.WriteLine(m1.GetHashCode());//32076894
                Console.WriteLine(m2.GetHashCode());//32076894
                Console.WriteLine(m1.Equals(m2));//True
                Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//False
  • 相关阅读:
    深入浅出WPF-08.Event( 事件)01
    深入浅出WPF-07.Property(属性)
    深入浅出WPF-06.Binding(绑定)03
    深入浅出WPF-06.Binding(绑定)02
    深入浅出WPF-06.Binding(绑定)01
    常用快递电子面单账户申请详解(顺丰、中通、圆通、申通、百世、韵达)
    快递鸟电子面单批量打印以及模板设置
    快递公司电子面单怎么申请充值单号(中通、圆通、申通、韵达、百世)
    不限量的快递鸟单号查询接口-JAVA对接方法
    快递单号识别查询api接口调用对接demo
  • 原文地址:https://www.cnblogs.com/huangsheng/p/6490578.html
Copyright © 2011-2022 走看看