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
  • 相关阅读:
    很长的下拉框菜单
    Pure CSS Buttons – Good Button Style and No Images
    ssh 配置
    php大量session存储到内存中,散列及过期回收
    array_append_distinct, array_erase函数
    关于C# 中的Attribute 特性(转载)
    Jquery如何操作Table的某一个td
    ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期
    ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
    ASP.NET应用程序生命周期趣谈(三)
  • 原文地址:https://www.cnblogs.com/huangsheng/p/6490578.html
Copyright © 2011-2022 走看看