• C#中的Equals()和Contains()


    这里讨论的是List<T>的Contains方法,Contains方法默认调用类型T的Equals方法

    而Object类的Equals方法支持值类型的比较和引用类型的比较,即如果继承自Object的类是引用类型的(C#中的所有类都继承自Object类),那么该类的Equals就比较是否引用了同一个对象。相反Struct结构体是值类型的,它的Equals方法使用值类型比较。

    C#中的String类比较特殊,唯独此类不符合上面的规定。虽然String为引用类型,但比较时使用值类型的比较方法。

    string s = new string('d',2);
    string x = "dd";

    s.Equals(x)的值为true

    所以一般情况下C#中可以把string当成是值类型。

    有一点需要注意,当Equals进行值类型的比较两个struct结构体时,对于其内部的字段,也会根据字段的类型使用值比较或者引用比较,不会因为是在比较两个结构体而对其中所有的字段都进行值的比较。

     举例说明:下面是用到的结构体和类

    struct A
        {
            public B x;
        }
        class B
        {
            string str;
            public B(string str)
            {
                this.str = str;
            }
        }
    

    第一种尝试,结果打印出OK: 

        class Program
    {
    static void Main()
    {
    B b = new B("3");

    A a = new A();
    a.x = b;

    A aa = new A();
    aa.x = b;

    if (a.Equals(aa))
    {
    Console.WriteLine("OK");

    }

    }

    }

    第二种尝试,结果没有打印出任何东西:

        class Program
    {
    static void Main()
    {
    A a = new A();
    a.x = new B("3");

    A aa = new A();
    aa.x = new B("3");

    if (a.Equals(aa))
    {
    Console.WriteLine("OK");

    }

    }

    }

    若有说的不恰当的地方,请不吝赐教。

  • 相关阅读:
    HDU5032 Always Cook Mushroom(树状数组&&离线)
    vue proxyTable
    vue-bus 组件通信插件
    gulp 静态资源版本控制
    js运算【按位非】~
    JS 的引用赋值与传值赋值
    手机端取消长按选中
    无刷新URL 更新
    移动端设计稿尺寸(微信端)
    4105: [Thu Summer Camp 2015]平方运算
  • 原文地址:https://www.cnblogs.com/Antech/p/2300775.html
Copyright © 2020-2023  润新知