仓酷云

标题: ASP.NET网页编程之[你必需晓得的.NET] 第六回:深切浅出关头字---base和this仓酷云 ... [打印本页]

作者: 海妖    时间: 2015-1-18 11:25
标题: ASP.NET网页编程之[你必需晓得的.NET] 第六回:深切浅出关头字---base和this仓酷云 ...
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库)系列文章目次索引:《你必需晓得的.NET
本文将先容以下内容:

1.弁言
new关头字引发了人人的很多存眷,特别感激AndersLiu的增补,让我感到博客园付与的交换平台真的无所不在。以是,我们就有需要持续这个话题,把我以为最值得存眷的关头字展开下往,本文的重点是会见关头字(AccessKeywords):base和this。固然会见关头字不是很难了解的话题,我们仍是有能够深切会商的中央来理清思绪。仍是老举措,我的成绩先列出来,您是不是做好了筹办。
2.基础观点
base和this在C#中被回于会见关头字,望文生义,就是用于完成承继机制的会见操纵,来满意对对象成员的会见,从而为多态机制供应加倍天真的处置体例。
2.1base关头字
其用于在派生类中完成对基类私有大概受回护成员的会见,可是只范围在机关函数、实例办法和实例属性会见器中,MSDN中小结的详细功效包含:

2.2this关头字
其用于援用类确当前实例,也包含承继而来的办法,一般能够埋没this,MSDN中的小结功效次要包含:

3.深切浅出
3.1示例为上
上面以一个小示例来综合的申明,base和this在会见操纵中的使用,从而对其有个提要懂得,更具体的划定规矩和深切我们接着论述。本示例没有完整的计划观点,次要用来论述base和this关头字的利用要点和难点论述,详细的以下:

ASP.NET网页编程之[你必需晓得的.NET] 第六回:深切浅出关头字---base和this仓酷云 ...
登录/注册后可看大图

<br>
ASP.NET网页编程之[你必需晓得的.NET] 第六回:深切浅出关头字---base和this仓酷云 ...
登录/注册后可看大图

<br>base和this示例
usingSystem;

namespaceAnytao.net.My_Must_net
{
publicclassAction
{
publicstaticvoidToRun(Vehiclevehicle)
{
Console.WriteLine("{0}isrunning.",vehicle.ToString());
}
}

publicclassVehicle
{
privatestringname;
privateintspeed;
privatestring[]array=newstring[10];

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[intparam]
{
get{returnarray[param];}
set{array[param]=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[1]="A6";
audi[2]="A8";
Console.WriteLine(audi[1]);
audi.Run();
audi.ShowResult();
}
}
}
3.2示例申明
下面的示例基础包含了base和this利用的一切基础功效演示,详细的申明能够从正文中失掉注释,上面的申明是对正文的进一步论述和增补,来讲明在使用方面的几个要点:
.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:callvoid[mscorlib]System.Console::WriteLine(string)
IL_0019:nop
IL_001a:ret
}//endofmethodAudi::ShowResult3.3深切分析
假如有三次大概更多承继,那末最上级派生类的base指向那一层呢?比方.NET系统中,假如以base会见,则应当是间接父类实例呢,仍是最高层类实例呢?
起首我们有需要懂得类创立过程当中的实例化按次,才干进一步懂得base机制的具体实行历程。一样平常来讲,实例化历程起首要先实例化其基类,而且依此类推,一向到实例化System.Object为止。因而,类实例化,老是从挪用System.Object.Object()入手下手。因而示例中的类Audi的实例化历程也许能够小结为以下按次实行,具体能够参考示例代码剖析。
我们在充实懂得实在例化按次的基本上就能够顺遂的掌控base和this在感化于机关函数时的实行情形,并进一步懂得其基础功效细节。
上面更主要的剖析则是,以ILDASM.exe工具为基本来剖析IL反编译代码,以便更深条理的懂得实行在base和this面前的使用本色,只要如许我们才干说对手艺有了基础的分析。
Main办法的实行情形为:

[attach]292769[/attach][attach]292770[/attach]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:callvoid[mscorlib]System.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.通用划定规矩

5.结论
base和this关头字,不是出格难于了解的内容,本文之以是将其作为系列的主题,除对其使用划定规矩做以小结以外,更主要的是在存眷其实行细节的基本上,对言语背景创建更明晰的掌控和剖析,这些才是进修和手艺使用的基本地点,也是.NET手艺框架中实质诉求。对进修者来讲,只要从实质下去掌控观点,才干在变更不凡的使用中,一眼找到谜底。
言回正传,开篇的几个标题,不知读者是不是有了各自的谜底,我们无妨各抒己见,做更深切的会商,以便揭开其实在的面纱。

<br>

参考文献
(USA)StanleyB.Lippman,C#Primer
(USA)DavidChappell,Understanding.NET
(Cnblog)Bear-Study-Hard,C#进修条记(二):机关函数的实行序列
[attach]292771[/attach]
广而告之
[预报]
别的鉴于前几个主题的会商中,不论是范例、关头字等都触及到援用范例和值范例的话题,我将于近期宣布相干内容的切磋,次要包含3个方面的内容,这是本系列近期意向,给本人做个告白。祝列位兴奋。
[声明]
本文的关头字指的是C#中的关头字观点,并不是一样平常意义上的.NETCRL范围,之以是将这个主题到场本系列,是基于在.NET系统下开辟的我们,何言能逃得过基础言语的只是要点。以是年夜可不用究查甚么是.NET,甚么是C#的话题,但愿人人理清观点,有的大肆。

作者: 变相怪杰    时间: 2015-1-21 07:53
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
作者: 分手快乐    时间: 2015-1-30 12:31
众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
作者: 若天明    时间: 2015-2-6 11:42
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
作者: 谁可相欹    时间: 2015-2-8 20:58
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
作者: 简单生活    时间: 2015-2-26 10:39
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
作者: 冷月葬花魂    时间: 2015-3-7 11:09
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
作者: 飘灵儿    时间: 2015-3-11 11:20
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
作者: 因胸联盟    时间: 2015-3-18 07:52
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
作者: 乐观    时间: 2015-3-25 13:17
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2