首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> 注册表教程
c#中的类型相等与恒等(equality & identity)_c#应用
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

CLR提供了可以区分类型的Equality 和Identity能力。

l  Equality:如果两个对象是相同的类型,并且它们各自带有相同和等值的属性。(They are instances of the same type and if each of the fields in one object matches the values of the fields in the other object)
Equality必须满足三个必要条件:reflexive, symmetrics, and transitive
reflexive: 自身相等,及a==a 是永远成立的;
symmetrics: 对象性,及a==b成立那么b==a 也成立;
transitive: 传递性,及a==b, b==c成立那么a==c 也成立。

l  Identity:两个对象必须相等(意味着他们共享同一块内存区域)(The two objects have the same values. – Two objects are identical if they share an address in memory)

CLR提供了至少四种方法来判断两个对象的等价性:

1.      Public static bool ReferenceEquals(object left, object right);

2.      Public static bool Equals(object left, object right);

3.      Public virtual bool Equals(object right);

4.      Public static bool operator==(MyClass left, MyClass right);

ReferenceEquals方法总是用来判断两个对象的Identity的,不管是针对值类型还是引用类型。所以针对值类型,调用该方法总是会返回false,因为值类型作为这个方法的参数时会进行装箱操作。

静态的Equals方法提供了判断两个对象的Equality能力,在其实现的内部,调用了上述第三个虚拟的Equals方法。和ReferenceEquals一样,它们已经具备从底层判断两个对象的能力,我们从来不会覆写这两个方法。

实例Equals方法也是用来区分两个对象的Equality的。

l  对于引用类型的对象,它和ReferenceEquals方法几乎是一样的。(因为判断两个引用类型是否的Equality往往从Identity上就可以区分)

l  而值类型的对象,我们不仅要判断他们具有相同的对象类型,还要判断他们的值相等。值类型从System.ValueType继承而来,ValueType已经重写了Object.Equals()方法,本来已经可以用来满足这些要求的。但是ValueType.Equals()方法不是很有效,因为它必须要通过反射,在不知道具体的派生类型中,完成对它们所含有成员变量的值的比较。因此,建议在我们实现一个值类型的数据结构时,同时重写ValueType.Equals()方法。

l  然而我们再回头看看引用类型,有时两个引用类型的对象往往被用来进行类似值类型的比较,比如:String类型,它虽然是引用类型,但它也重写了Equals方法,因为我们拿它来判断两个string是否相同(Equality),实际是希望判断它们是否具有相同的内容,这是一个value semantics。因此,我们建议在考虑实现一个用作值语义环境下的引用类型时候,也重写基类的Object.Equals()方法。

注:请参考MDSN或其它相关文档,如何实现Equals方法的重写。

上面的图示给了很好的例子来区分Equals和ReferenceEquals方法,被用来做Equility和Identity判断的区别。

==运算符是可由类重载的运算符,它也是用来判断恒等的。
对于未重载==的引用类型,会比较两个引用类型是否引用同一个对象。这跟引用类型的Equals()方法是一样的。

对于未重载==的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。和Equals方法一样,推荐在自定义值类型中,也要重载==运算符,因为也存在反射在效率上的影响。

==运算符和Equals方法的区别在于多态表现上。Equals方法是重写,而==运算符是被重载。这意味着除非编译器知道调用具体的重载版本,否则它只是调用未重载的==版本。


参考资料:
《Essential .NET, Volume 1: The Common Language》 By DonBox, Chris Sells
《Applied Microsoft .NET Framework Programming》By Jeffrey Richter


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·更改internet explorer的图标
·C#中的类型转换-.NET教程,C#语言
·找回flash的序列号sn
·更改ie的图标
·如何让你的VB6 IDE支持鼠标滚轮(过程)-.NET教程,VB.Net语言
·正则表达式Replace-.NET教程,Asp.Net开发
·Windows 2003下不注册组件用ASP发邮件-ASP教程,邮件相关
·防止ie被恶意修改的初级技巧
·asp.net实现分组全选部分复选框-ASP教程,ASP应用
·清理ie网址列表
最新文章
·seo新手教程:title的写法_seo网站优化
·从注册表下手 切断一切黑客入侵的路径_注册表教程
·用flash 8 as代码写摄像头拍照功能_flash教程
·小站长赚钱思路:ip不到1000,一个月赚940元_网赚技巧
·陈艺光:网络游戏平台与游戏网站实现共赢_站长访谈
·留住访客 如何最优化设计网站的首页?(2)_站长心得
·为什么在google上搜不到我的网页?_google推广
·google的秘密 搜索引擎利用软件的魔力加快奔跑_google推广
·域名与网站排名_站长心得
·怎样避免被搜索引擎视为作弊_站长心得
相关主题
  • C#中的类型转换-.NET教程,C#语言
  • C#中的类型转换-.NET教程,C#语言
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭