ASP.NET网页编程之[你必需晓得的.NET] 第六回:深切浅出关头字---base和this仓酷云 ...
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库)系列文章目次索引:《你必需晓得的.NET》本文将先容以下内容:
[*]面向对象基础观点
[*]base关头字深切浅出
[*]this关头字深切浅出
1.弁言
new关头字引发了人人的很多存眷,特别感激AndersLiu的增补,让我感到博客园付与的交换平台真的无所不在。以是,我们就有需要持续这个话题,把我以为最值得存眷的关头字展开下往,本文的重点是会见关头字(AccessKeywords):base和this。固然会见关头字不是很难了解的话题,我们仍是有能够深切会商的中央来理清思绪。仍是老举措,我的成绩先列出来,您是不是做好了筹办。
[*]是不是能够在静态办法中利用base和this,为何?
[*]base经常使用于哪些方面?this经常使用于哪些方面?
[*]能够base会见基类的统统成员吗?
[*]假如有三层大概更多承继,那末最上级派生类的base指向那一层呢?比方.NET系统中,假如以base会见,则应当是间接父类实例呢,仍是最高层类实例呢?
[*]以base和this使用于机关函数时,承继类对象实例化的实行按次怎样?
2.基础观点
base和this在C#中被回于会见关头字,望文生义,就是用于完成承继机制的会见操纵,来满意对对象成员的会见,从而为多态机制供应加倍天真的处置体例。
2.1base关头字
其用于在派生类中完成对基类私有大概受回护成员的会见,可是只范围在机关函数、实例办法和实例属性会见器中,MSDN中小结的详细功效包含:
[*]挪用基类上已被其他办法重写的办法。
[*]指定创立派生类实例时应挪用的基类机关函数。
2.2this关头字
其用于援用类确当前实例,也包含承继而来的办法,一般能够埋没this,MSDN中的小结功效次要包含:
[*]限制被类似的称号埋没的成员
[*]将对象作为参数传送到其他办法
[*]声明索引器
3.深切浅出
3.1示例为上
上面以一个小示例来综合的申明,base和this在会见操纵中的使用,从而对其有个提要懂得,更具体的划定规矩和深切我们接着论述。本示例没有完整的计划观点,次要用来论述base和this关头字的利用要点和难点论述,详细的以下:
<br>
<br>base和this示例
usingSystem;
namespaceAnytao.net.My_Must_net
{
publicclassAction
{
publicstaticvoidToRun(Vehiclevehicle)
{
Console.WriteLine("{0}isrunning.",vehicle.ToString());
}
}
publicclassVehicle
{
privatestringname;
privateintspeed;
privatestring[]array=newstring;
publicVehicle()
{
}
//限制被类似的称号埋没的成员
publicVehicle(stringname,intspeed)
{
this.name=name;
this.speed=speed;
}
publicvirtualvoidShowResult()
{
Console.WriteLine("Thetopspeedof{0}is{1}.",name,speed);
}
publicvoidRun()
{
//传送以后实例参数
Action.ToRun(this);
}
//声明索引器,必需为this,如许就能够像数组一样来索引对象
publicstringthis
{
get{returnarray;}
set{array=value;}
}
}
publicclassCar:Vehicle
{
//派生类和基类通讯,以base完成,基类起首被挪用
//指定创立派生类实例时应挪用的基类机关函数
publicCar()
:base("Car",200)
{}
publicCar(stringname,intspeed)
:this()
{}
publicoverridevoidShowResult()
{
//挪用基类上已被其他办法重写的办法
base.ShowResult();
Console.WriteLine("It"sacar"sresult.");
}
}
publicclassAudi:Car
{
publicAudi()
:base("Audi",300)
{}
publicAudi(stringname,intspeed)
:this()
{
}
publicoverridevoidShowResult()
{
//由三层承继能够看出,base只能承继其间接基类成员
base.ShowResult();
base.Run();
Console.WriteLine("It"saudi"sresult.");
}
}
publicclassBaseThisTester
{
publicstaticvoidMain(string[]args)
{
Audiaudi=newAudi();
audi="A6";
audi="A8";
Console.WriteLine(audi);
audi.Run();
audi.ShowResult();
}
}
}
3.2示例申明
下面的示例基础包含了base和this利用的一切基础功效演示,详细的申明能够从正文中失掉注释,上面的申明是对正文的进一步论述和增补,来讲明在使用方面的几个要点:
[*]base经常使用于,在派生类对象初始化时和基类举行通讯。
[*]base能够会见基类的私有成员和受回护成员,公有成员是不成会见的。
[*]this指代类对象自己,用于会见本类的一切常量、字段、属性和办法成员,并且不论会见元素是任何会见级别。由于,this仅仅范围于对象外部,对象内部是没法看到的,这就是this的基础头脑。别的,静态成员不是对象的一部分,因而不克不及在静态办法中援用this。
[*]在多层承继中,base能够指向的父类的办法有两种情形:一是有重载存在的情形下,base将指向间接承继的父类成员的办法,比方Audi类中的ShowResult办法中,利用base会见的将是Car.ShowResult()办法,而不克不及会见Vehicle.ShowResult()办法;而是没有重载存在的情形下,base能够指向任何下级父类的私有大概受回护办法,比方Audi类中,可使用base会见基类Vehicle.Run()办法。这些我们可使用ILDasm.exe,从IL代码中失掉谜底。
.methodpublichidebysigvirtualinstancevoid
ShowResult()cilmanaged
{
//代码巨细27(0x1b)
.maxstack8
IL_0000:nop
IL_0001:ldarg.0
//base挪用父类成员
IL_0002:callinstancevoidAnytao.net.My_Must_net.Car::ShowResult()
IL_0007:nop
IL_0008:ldarg.0
//base挪用父类成员,由于没有完成Car.Run(),以是指向更初级父类
IL_0009:callinstancevoidAnytao.net.My_Must_net.Vehicle::Run()
IL_000e:nop
IL_000f:ldstr"It"saudi"sresult."
IL_0014:callvoidSystem.Console::WriteLine(string)
IL_0019:nop
IL_001a:ret
}//endofmethodAudi::ShowResult3.3深切分析
假如有三次大概更多承继,那末最上级派生类的base指向那一层呢?比方.NET系统中,假如以base会见,则应当是间接父类实例呢,仍是最高层类实例呢?
起首我们有需要懂得类创立过程当中的实例化按次,才干进一步懂得base机制的具体实行历程。一样平常来讲,实例化历程起首要先实例化其基类,而且依此类推,一向到实例化System.Object为止。因而,类实例化,老是从挪用System.Object.Object()入手下手。因而示例中的类Audi的实例化历程也许能够小结为以下按次实行,具体能够参考示例代码剖析。
[*]实行System.Object.Object();
[*]实行Vehicle.Vehicle(stringname,intspeed);
[*]实行Car.Car();
[*]实行Car.Car(stringname,intspeed);
[*]实行Audi.Audi();
[*]实行Audi.Audi(stringname,intspeed)。
我们在充实懂得实在例化按次的基本上就能够顺遂的掌控base和this在感化于机关函数时的实行情形,并进一步懂得其基础功效细节。
上面更主要的剖析则是,以ILDASM.exe工具为基本来剖析IL反编译代码,以便更深条理的懂得实行在base和this面前的使用本色,只要如许我们才干说对手艺有了基础的分析。
Main办法的实行情形为:
IL剖析base和this实行
.methodpublichidebysigstaticvoidMain(string[]args)cilmanaged
{
.entrypoint
//代码巨细61(0x3d)
.maxstack3
.localsinit(classAnytao.net.My_Must_net.AudiV_0)
IL_0000:nop
//利用newobj指令创立新的对象,并挪用机关函数初始化
IL_0001:newobjinstancevoidAnytao.net.My_Must_net.Audi::.ctor()
IL_0006:stloc.0
IL_0007:ldloc.0
IL_0008:ldc.i4.1
IL_0009:ldstr"A6"
IL_000e:callvirtinstancevoidAnytao.net.My_Must_net.Vehicle::set_Item(int32,
string)
IL_0013:nop
IL_0014:ldloc.0
IL_0015:ldc.i4.2
IL_0016:ldstr"A8"
IL_001b:callvirtinstancevoidAnytao.net.My_Must_net.Vehicle::set_Item(int32,
string)
IL_0020:nop
IL_0021:ldloc.0
IL_0022:ldc.i4.1
IL_0023:callvirtinstancestringAnytao.net.My_Must_net.Vehicle::get_Item(int32)
IL_0028:callvoidSystem.Console::WriteLine(string)
IL_002d:nop
IL_002e:ldloc.0
IL_002f:callvirtinstancevoidAnytao.net.My_Must_net.Vehicle::Run()
IL_0034:nop
IL_0035:ldloc.0
//base.ShowResult终极挪用的是第一流父类Vehicle的办法,
//而不是间接父类Car.ShowResult()办法,这是应当存眷的
IL_0036:callvirtinstancevoidAnytao.net.My_Must_net.Vehicle::ShowResult()
IL_003b:nop
IL_003c:ret
}//endofmethodBaseThisTester::Main
因而,对重写父类办法,终极指向了第一流父类的办法成员。
4.通用划定规矩
[*]只管罕用大概不必base和this。除决定子类的称号抵触和在一个机关函数中挪用其他的机关函数以外,base和this的利用简单引发不用要的了局。
[*]在静态成员中利用base和this都是不同意的。缘故原由是,base和this会见的都是类的实例,也就是对象,而静态成员只能由类来会见,不克不及由对象来会见。
[*]base是为了完成多态而计划的。
[*]利用this或base关头字只能指定一个机关函数,也就是说不成同时将this和base感化在一个机关函数上。
[*]复杂的来讲,base用于在派生类中会见重写的基类成员;而this用于会见本类的成员,固然也包含承继而来私有和回护成员。
[*]除base,会见基类成员的别的一种体例是:显现的范例转换来完成。只是该办法不克不及为静态办法。
5.结论
base和this关头字,不是出格难于了解的内容,本文之以是将其作为系列的主题,除对其使用划定规矩做以小结以外,更主要的是在存眷其实行细节的基本上,对言语背景创建更明晰的掌控和剖析,这些才是进修和手艺使用的基本地点,也是.NET手艺框架中实质诉求。对进修者来讲,只要从实质下去掌控观点,才干在变更不凡的使用中,一眼找到谜底。
言回正传,开篇的几个标题,不知读者是不是有了各自的谜底,我们无妨各抒己见,做更深切的会商,以便揭开其实在的面纱。
<br>
参考文献
(USA)StanleyB.Lippman,C#Primer
(USA)DavidChappell,Understanding.NET
(Cnblog)Bear-Study-Hard,C#进修条记(二):机关函数的实行序列
广而告之
[预报]
别的鉴于前几个主题的会商中,不论是范例、关头字等都触及到援用范例和值范例的话题,我将于近期宣布相干内容的切磋,次要包含3个方面的内容,这是本系列近期意向,给本人做个告白。祝列位兴奋。
[声明]
本文的关头字指的是C#中的关头字观点,并不是一样平常意义上的.NETCRL范围,之以是将这个主题到场本系列,是基于在.NET系统下开辟的我们,何言能逃得过基础言语的只是要点。以是年夜可不用究查甚么是.NET,甚么是C#的话题,但愿人人理清观点,有的大肆。
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 众所周知,Windows以易用而出名,也因此占据不少的服务器市场。 关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。 Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。 HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了. 我的意思是.net好用,从功能上来说比JAVA强还是很明显的。 HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了. ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
页:
[1]