• C#中==与Equals办法的差别


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
    class Person
    {
    private string name;
    public string Name
    {
    get { return name; }
    set { name = value; }
    }
    public Person(string name)
    {
    this.name = name;
    }
    }
    class program
    {
    static void Main(string[] args)
    {
    string a = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });
    string b = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });
    Console.WriteLine(a == b);
    Console.WriteLine(a.Equals(b));
    object g = a;
    object h = b;
    Console.WriteLine(g == h);
    Console.WriteLine(g.Equals(h));
    Person p1 = new Person("jia");
    Person p2 = new Person("jia");
    Console.WriteLine(p1 == p2);
    Console.WriteLine(p1.Equals(p2));
    Person p3 = new Person("jia");
    Person p4 = p3;
    Console.WriteLine(p3 == p4);
    Console.WriteLine(p3.Equals(p4));
    Console.ReadLine();
    }
    }
    }

    输出成果:true ,true ,false ,true ,false ,false ,true ,true 。
    总结如下:

        1、对于值类型,==和equals等价,都是斗劲存储信息的内容。
        2、对于引用类型,==斗劲的是引用类型在栈中的地址,equals办法例斗劲的是引用类型在托管堆中的存储信息的内容。
        3、对于string类要特别处理惩罚,它是一个内部已经处理惩罚好了equals办法和==的类,故==和equals等价,都是斗劲存储信息的内容。
        4、对于一些自定义的类,我们有须要重载equals办法,不然它默认为基类的equals办法(基类没有重载Equals办法例为Object类中的Equals办法),他们的斗劲也为地址,而不是引用类型在托管堆中的存储信息的内容。

     

    故我们就不难懂得
    以下输出了:


    Person p1 = new Person("jia");
    Person p2 = new Person("jia");
    Console.WriteLine(p1 == p2);//输出False
    Console.WriteLine(p1.Equals(p2));//输出False

    5、对于string我们有须要夸大一下常量字符串与字符串变量的差别,请看一下例子:


    // 常量字符串
    string x = "should it matter"; //指向同一个地址,即所谓的常量池
    string y = "should it matter";
    object c = x;
    object d = y;
    Console.WriteLine(c == d);//输出True
    Console.WriteLine(c.Equals(d));//输出True
    // 字符串变量
    string a = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });// 指向的地址不一样,是动态分派的
    string b = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o"" });
    object g = a;
    object h = b;
    Console.WriteLine(g == h);//输出False
    Console.WriteLine(g.Equals(h));//输出True

    他们分派地址的体式格式不一样,string x = "should it matter"; 因为它的初始值是一个常量,所以其地址分派在托管堆上的静态存储区,即所谓的常量池,而楼主的string a = new string(new char[] { ""h"", ""e"", ""l"", ""l"", ""o""}); 则不一样,它这是在托管堆上动态分派的地址。
     http://www.byywee.com/page/M0/S706/706092.html

  • 相关阅读:
    enum
    高可用复用类
    int 和 Integer 的区别
    MysqlMd5加密
    软件测试例子
    Wordcount
    大气登录页面
    生成二维码的JAVA
    多态的理解
    打印低头思故乡 java
  • 原文地址:https://www.cnblogs.com/Areas/p/2421842.html
Copyright © 2020-2023  润新知