|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。CLR供应了能够辨别范例的Equality和Identity才能。
lEquality:假如两个工具是不异的范例,而且它们各自带有不异和等值的属性。(Theyareinstancesofthesametypeandifeachofthefieldsinoneobjectmatchesthevaluesofthefieldsintheotherobject)
Equality必需满意三个需要前提:reflexive,symmetrics,andtransitive
reflexive:本身相称,及a==a是永久建立的;
symmetrics:工具性,及a==b建立那末b==a同样成立;
transitive:传送性,及a==b,b==c建立那末a==c同样成立。
lIdentity:两个工具必需相称(意味着他们共享统一块内存地区)(Thetwoobjectshavethesamevalues.CTwoobjectsareidenticaliftheyshareanaddressinmemory)
CLR供应了最少四种办法来判别两个工具的等价性:
1.PublicstaticboolReferenceEquals(objectleft,objectright);
2.PublicstaticboolEquals(objectleft,objectright);
3.PublicvirtualboolEquals(objectright);
4.Publicstaticbooloperator==(MyClassleft,MyClassright);
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),实践是但愿判别它们是不是具有不异的内容,这是一个valuesemantics。因而,我们倡议在思索完成一个用作值语义情况下的援用范例时分,也重写基类的Object.Equals()办法。
注:请参考MDSN或别的相干文档,怎样完成Equals办法的重写。
下面的图示给了很好的例子来辨别Equals和ReferenceEquals办法,被用来做Equility和Identity判别的区分。
==运算符是可由类重载的运算符,它也是用来判别恒等的。
关于未重载==的援用范例,会对照两个援用范例是不是援用统一个工具。这跟援用范例的Equals()办法是一样的。
关于未重载==的值范例,该运算符会对照这两个值是不是"按位"相称,便是否这两个值中的每一个字段都相称。和Equals办法一样,保举在自界说值范例中,也要重载==运算符,由于也存在反射在效力上的影响。
==运算符和Equals办法的区分在于多态体现上。Equals办法是重写,而==运算符是被重载。这意味着除非编译器晓得挪用详细的重载版本,不然它只是挪用未重载的==版本。
参考材料:
《Essential.NET,Volume1:TheCommonLanguage》ByDonBox,ChrisSells
《AppliedMicrosoft.NETFrameworkProgramming》ByJeffreyRichter
前天傍晚我发表了《Java的跨平台就是一句谎言。》,原本就是周末闲来无事,发表一篇略带争议性的博文让大家都来吵吵架,发表自己的看法,根本就没想着谁把谁打倒,一个行业或者是技术阵营是无法用短期口水仗打到对手的。 |
|