仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1047|回复: 14
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计[你必需晓得的.NET] 第五回:深切浅出关头字――把new说透仓酷云 ...

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
其实net网页编程之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是net网页编程的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。系列文章目次索引:《你必需晓得的.NET
本文将先容以下内容:


  • 面向对象基础观点
  • new关头字深切浅出
  • 对象创立的内存办理
1.弁言
园子里仿佛没有大概很少把new关头字拿出来讲的,那我就占个先机吧,呵呵。那末,我们究竟有需要将一个关头字拿出来长篇年夜论吗?看来是个成绩。回覆的关头是:你真的了解了new吗?假如是,那请不要华侈工夫,假如不是,那请持续本文的循序之旅。
上面几个成绩能够也许的考查你对new的把握,开篇之前,但愿人人做个查验,假如经由过程了,间接关失落本页便可。假如没有经由过程,但愿本文的论述能帮你找出谜底。

  • new一个class对象和new一个struct大概enum有甚么分歧?
  • new在.NET中有几个用处,除创立对象实例,还能做甚么?
  • new运算符,能够重载吗?
  • 范型中,new有甚么感化?
  • new一个承继上去的办法和override一个承继办法有何区分?
  • inti和inti=newint()有甚么分歧?
2.基础观点
一样平常说来,new关头字在.NET顶用于以下几个场所,这是MSDN的典范注释:


  • 作为运算符,用于创立对象和挪用机关函数。
本文的重点内容,本文鄙人一节来重点思索。


  • 作为润色符,用于向基类成员埋没承继成员。
作为润色符,基础的划定规矩能够总结为:完成派生类中埋没办法,则基类办法必需界说为virtual;new作为润色符,完成埋没基类成员时,不成和override共存,缘故原由是这二者语义相斥:new用于完成创立一个新成员,同时埋没基类的同名成员;而override用于完成对基类成员的扩大。
别的,假如在子类中埋没了基类的数据成员,那末对基类原数据成员的会见,能够经由过程base润色符来完成。
比方:

<br>
<br>new作为润色符
usingSystem;

namespaceAnytao.net.My_Must_net
{
classNumber
{
publicstaticinti=123;

publicvoidShowInfo()
{
Console.WriteLine("baseclass---");
}

publicvirtualvoidShowNumber()
{
Console.WriteLine(i.ToString());
}
}

classIntNumber:Number
{
newpublicstaticinti=456;

publicnewvirtualvoidShowInfo()
{
Console.WriteLine("Derivedclass---");
}

publicoverridevoidShowNumber()
{
Console.WriteLine("Basenumberis{0}",Number.i.ToString());
Console.WriteLine("Newnumberis{0}",i.ToString());
}
}

classTester
{
publicstaticvoidMain(string[]args)
{
Numbernum=newNumber();
num.ShowNumber();
IntNumberintNum=newIntNumber();
intNum.ShowNumber();

Numbernumber=newIntNumber();
//事实挪用了谁?
number.ShowInfo();
//事实挪用了谁?
number.ShowNumber();
}
}
}


  • 作为束缚,用于在泛型声明中束缚大概用作范例参数的参数的范例。
MSDN中的界说是:new束缚指定泛型类声明中的任何范例参数都必需有大众的无参数机关函数。当泛型类创立范例的新实例时,将此束缚使用于范例参数。
注重:new作为束缚和其他束缚共存时,必需在最初指定。
其界说体例为:
classGenericer<T>whereT:new()
{
publicTGetItem()
{
returnnewT();
}
}
完成体例为:
classMyCls
{
privatestring_name;

publicstringName
{
get{return_name;}
set{_name=value;}
}

publicMyCls()
{
_name="Emma";
}
}

classMyGenericTester
{
publicstaticvoidMain(string[]args)
{
Genericer<MyCls>MyGen=newGenericer<MyCls>();
Console.WriteLine(MyGen.GetItem().Name);
}
}


  • 利用new完成多态。这不是我熟习的话题,具体的内容能够拜见《多态与new[C#]》,这里有较具体的叙述。
3.深切浅出
作为润色符和束缚的情形,不是很难了解的话题,正如我们看到本文开篇提出的成绩,也年夜多会合在new作为运算符的情形,因而我们研讨的重点就是揭开new作为运算符的宿世此生。
JeffreyRichter在其著作中,尽力保举读者利用ILDASM工具检察IL言语细节,从而进步对.NET的深切探求,在我以为这真是一条不错的倡议,也给了本人良多进步的空间发掘。因而,以下是自己的一点倡议,我将在后续的系列中,关于进修办法论的会商中深切切磋,这里只是特地小议,但愿无益于人人。
1不休的进修代码;
2常常看看IL言语的运转细节,关于供应.NET的熟悉十分无效。
文回正题,new运算符用于前往一个援用,指向体系分派的托管堆的内存地点。因而,在此我们以Reflector工具,来懂得以下new操纵符实行的面前,埋没着甚么玄机。
起首我们完成一段最复杂的代码,然后剖析其元数据的完成细节,来寻找new在创立对象时到做了甚么?
new作为运算符
usingSystem;

namespaceAnytao.net.My_Must_net
{
classMyClass
{
privateint_id;

publicMyClass(intid)
{
_id=id;
}
}

structMyStruct
{
privatestring_name;

publicMyStruct(stringname)
{
_name=name;
}
}

classNewReflecting
{
publicstaticvoidMain(string[]args)
{
inti;
intj=newint();
MyClassmClass=newMyClass(123);
MyStructmStruct=newMyStruct("MyStruct");
}
}
}
利用Reflector工具反编译发生的IL代码以下为:
IL元数据剖析
.methodpublichidebysigstaticvoidMain(string[]args)cilmanaged
{
.entrypoint
.maxstack2
.localsinit(
[0]int32num,
[1]int32num2,
[2]classAnytao.net.My_Must_net._05_new.MyClassclass2,
[3]valuetypeAnytao.net.My_Must_net._05_new.MyStructstruct2)
L_0000:nop

//初始化j为0
L_0001:ldc.i4.0
L_0002:stloc.1

//利用newobj指令创立新的对象,并挪用机关函数以0x76(123的16进制)初始化
L_0003:ldc.i4.s0x7b
L_0005:newobjinstancevoidAnytao.net.My_Must_net._05_new.MyClass::.ctor(int32)
L_000a:stloc.2
//加载“MyStruct”
L_000b:ldloca.sstruct2
L_000d:ldstr"MyStruct"
//挪用机关函数实行初始化
L_0012:callinstancevoidAnytao.net.My_Must_net._05_new.MyStruct::.ctor(string)
L_0017:nop
L_0018:ret
}从而能够得出以下结论:


  • new一个class时,new完成了以下两个方面的内容:一是挪用newobj命令来为实例在托管堆平分配内存;二是挪用机关函数来完成对象初始化。
  • new一个struct时,new运算符用于挪用其带机关函数,完成实例的初始化。
  • new一个int时,new运算符用于初始化其值为0。
  • 别的必需分明,值范例和援用范例在分派内存时是分歧的,值范例分派于线程的仓库(stack)上,并变量自己就保留实在值,因而也不受GC的把持,;而援用范例变量,包括了指向托管堆的援用,内存分派于托管堆(managedheap)上,内存搜集由GC完成。
别的另有以下划定规矩要多加注重:


  • new运算符不成重载。
  • new分派内存失利,将激发OutOfMemoryException非常。
关于基础范例来讲,利用new操纵符来举行初始化的优点是,某些机关函数能够完成更优胜的初始化操纵,而制止了不拙劣的选择,比方:
stringstr=newstring("*",100);

stringstr=newstring(newchar[]{"a","b","c"});

而不是
stringstr="***************************************";4.结论
我能说的就这么多了,至于透了没透,作者的能量也就这么多了。但愿园子的年夜牛们常来扔块砖头,对我也是一种莫年夜的增进。可是作为基础的道理和使用,我想对年夜部分的需求是满意了。但愿这类力图深切浅出的先容,能给你分享new关头字和其实质的前因后果能有所匡助。
言回正传,开篇的几个标题,不知读者是不是有了各自的谜底,我们无妨各抒己见,做更深切的会商,以便揭开其实在的面纱。
参考文献
(USA)StanleyB.Lippman,C#Primer
(USA)DavidChappellUnderstanding.NET

<br>
广而告之
[预报]
别的鉴于前几个主题的会商中,不论是范例、关头字等都触及到援用范例和值范例的话题,我将于近期宣布相干内容的切磋,同时另有其他的关头字值得研讨,这是本系列近期意向,给本人做个告白。祝列位兴奋。
[声明]
本文的关头字new指的是C#中的关头字观点,并不是一样平常意义上的.NETCRL范围,之以是将这个主题到场本系列,是基于在.NET系统下开辟的我们,何言能逃得过基础言语的只是要点。以是年夜可不用究查甚么是.NET,甚么是C#的话题,但愿人人理清观点,有的大肆。
爱飞 该用户已被删除
沙发
发表于 2015-1-18 18:11:25 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
再见西城 该用户已被删除
板凳
发表于 2015-1-22 19:52:05 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
第二个灵魂 该用户已被删除
地板
发表于 2015-1-25 17:52:28 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
谁可相欹 该用户已被删除
5#
发表于 2015-2-1 10:38:55 来自手机 | 只看该作者
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
因胸联盟 该用户已被删除
6#
发表于 2015-2-4 00:04:22 | 只看该作者
ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-2-4 13:38:35 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
再现理想 该用户已被删除
8#
发表于 2015-2-9 23:54:19 | 只看该作者
但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
兰色精灵 该用户已被删除
9#
发表于 2015-2-10 05:48:46 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
乐观 该用户已被删除
10#
发表于 2015-2-28 21:58:38 | 只看该作者
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
若天明 该用户已被删除
11#
发表于 2015-3-7 08:31:54 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
柔情似水 该用户已被删除
12#
 楼主| 发表于 2015-3-10 11:49:03 | 只看该作者
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
admin 该用户已被删除
13#
发表于 2015-3-17 06:12:29 | 只看该作者
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-17 06:12:29 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
变相怪杰 该用户已被删除
15#
发表于 2015-3-23 23:13:27 | 只看该作者
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表