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
  • 相关阅读:
    服务器端口
    Format(const wchar_t *,...)”: 不能将参数 1 从“const char [3]”转换为“const wchar_t *”.
    图片格式
    CreateEx
    电力谐波
    [OGeek2019]babyrop
    Simple Inject
    [GXYCTF2019]BabySQli
    [CISCN2019 华北赛区 Day2 Web1]Hack World
    极客大挑战2019
  • 原文地址:https://www.cnblogs.com/huangsheng/p/6490578.html
Copyright © 2011-2022 走看看