• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#的Contains()值还是引用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

这里讨论的是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");

            }            

        }

    }
 
转:http://www.cnblogs.com/antech/archive/2011/12/25/2300775.html

这里讨论的是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");

            }            

        }

    }
 
转:http://www.cnblogs.com/antech/archive/2011/12/25/2300775.html

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#学习笔记(十八):数据结构和泛型发布时间:2022-07-10
下一篇:
c#桌面窗体软件【学习笔记】发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap