zoukankan      html  css  js  c++  java
  • C#中Equals()与运算符==区别

    1、对于值类型:

      如果对象的值相等,则相等运算符==返回True,否则返回False。

    2、对于引用类型:

      ==操作符比较的是两个变量的值是否相等,或两个引用是不是指向同一个内存地址。

      equals()方法比较的是两个对象指向的内存空间里的内容是不是相同。equals也就是比较两个“引用类型”是否是对同一个对象的引用。即两个对象的内容是否相等。

        public class ClassPerson
        {
            public ClassPerson(string strname)
            {
                name = strname;
            }
            private string name = null;
            public string Name
            {
                set { name = value; }
                get { return name; }
            }
        }
    
            string s1 = "test";
            string s2 = "test";
            Console.WriteLine(s1 == s2); //True
            Console.WriteLine(s1.Equals(s2)); //True
    
            object o1 = s1;
            object o2 = s2;
            Console.WriteLine(o1 == o2); //True
            Console.WriteLine(o1.Equals(o2)); //True
    
            string s3 = new string(new char[] { 't', 'e', 's', 't' });
            string s4 = new string(new char[] { 't', 'e', 's', 't' });
            Console.WriteLine(s3 == s4);  //True
            Console.WriteLine(s3.Equals(s4));  //True
    
            object o3 = s3;
            object o4 = s4;
            Console.WriteLine(o3 == o4); //False
            Console.WriteLine(o3.Equals(o4)); //True
    
            ClassPerson p1 = new ClassPerson("ltp");
            ClassPerson p2 = new ClassPerson("ltp");
            Console.WriteLine(p1 == p2);  //False
            Console.WriteLine(p1.Equals(p2)); //False
    
            ClassPerson p3 = new ClassPerson("ltp");
            ClassPerson p4 = p3;
            Console.WriteLine(p3 == p4); //True
            Console.WriteLine(p3.Equals(p4)); //True
     

      值类型是存储在内存中的堆栈(以下简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

      ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

      equals操作表示的是两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

      而字符串是一个特殊的引用型类型,在C#语言中,重载了string对象的很多方法(包括equals()方法),使string对象用起来就像是值类型一样。

      因此在上面的例子中,字符串s3和字符串s4的两个比较是相等的。

      因为object o3和object o4在内存中是两个不同的对象,所以存储的地址(在栈中的内容)是不相同的,故不相等。而o3.Equals(o4)用的是equals()方法,比较的是两个对象存储地址对应的内存空间里的内容,故相等。

      而对于object o1和object o2是相等的。因为系统并没有给字符串s2分配内存,只是将“test”指向了s2。所以s1和s2指向的是同一个字符串(字符串在这种赋值的情况下被做了内存的优化)。

      对于p1和p2,也是内存中两个不同的对象,所以在内存中地地址肯定不相同,故p1==p2会返回False;又因为p1和p2是对不同对象的引用,所以p1.equals(p2)也返回False。

      对于p3和p4,由于p4=p3,p3将对象的引用赋给了p4,p3和p4指向同一地址,是对同一个对象的引用,所以两个比较都返回True。

  • 相关阅读:
    js_阶乘
    python 最新方案-解决编码错误问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position
    RabbitMQ Python端发送消息给Java端 接受消息全数字问题
    【Hadoop】第六天 Hive
    【Hadoop 】第五天 Hadoop-HA 搭建
    Redis面试常问点
    python md5 salt 摘要算法
    【Hadoop】第四天 Shuffle MapReduce组件全貌
    【Hadoop】第三天 mapreduce的原理和编程
    【Hadoop 】第二天 hdfs的原理和使用操作、编程
  • 原文地址:https://www.cnblogs.com/lhl98/p/2915267.html
Copyright © 2011-2022 走看看