ASP.NET教程之C#中的范例相称与恒等(Equality & Iden...
对于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的跨平台就是一句谎言。》,原本就是周末闲来无事,发表一篇略带争议性的博文让大家都来吵吵架,发表自己的看法,根本就没想着谁把谁打倒,一个行业或者是技术阵营是无法用短期口水仗打到对手的。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。 ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
页:
[1]