仓酷云

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

[学习教程] ASP.NET网站制作之[你必需晓得的.NET]第十六回:深切浅出关头字――using全打仗仓酷云 ...

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

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

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

x
也不知道,我同学昨天说数据挖掘很好。系列文章目次索引:《你必需晓得的.NET
本文将先容以下内容:


  • using指令的多种用法
  • using语句在Dispose形式中的使用

<br>



1.弁言
在.NET小家庭中,有很多的关头字承当了多种脚色,比方new关头字就身兼数职,除可以创立对象,在承继系统中埋没基类成员,还在泛型声明中束缚大概用作范例参数的参数,在[第五回:深切浅出关头字---把new说透]我们对此都有具体的叙述。本文,将把眼光转移到别的一个身兼数职的明星关头字,这就是using关头字,在具体会商using的多重身份的基本下去懂得.NET在言语机制上的烦琐与深奥。

那末,using的多重身份都表现在哪些方面呢,我们先一睹为快吧:

·引进定名空间
·创立别号
·强迫资本清算
上面,本文将从这几个角度来论述using的多彩使用。

2.引进定名空间
using作为引进定名空间指令的用律例则为:
usingNamespace;
在.NET程序中,最多见的代码莫过于在程叙文件的开首引进System定名空间,其缘故原由在于System定名空间中封装了良多最基础最经常使用的操纵,上面的代码对我们来讲最为熟习不外:
usingSystem;
如许,我们在程序中就能够间接利用定名空间中的范例,而不用指定具体的范例称号。using指令能够会见嵌套定名空间。
关于:定名空间

定名空间是.NET程序在逻辑上的构造布局,而并不是实践的物理布局,是一种制止类名抵触的办法,用于将分歧的数据范例组合分别的体例。比方,在.NET中良多的基础范例都位于System定名空间,数据操纵范例位于System.Data定名空间,

误区:

·using相似于Java言语的import指令,都是引进定名空间(Java中称作包)这类逻辑布局;而分歧于C言语中的#include指令,用于引进实践的类库,
·using引进定名空间,其实不即是编译器编译时加载该定名空间地点的程序集,程序集的加载决意于程序中对该程序集是不是存在挪用操纵,假如代码中不存在任何挪用操纵则编译器将不会加载using引进定名空间地点程序集。因而,在源文件开首,引进多个定名空间,并不是加载多个程序集,不会形成“过分援用”的坏处。
3.创立别号
using为定名空间创立别号的用律例则为:
usingalias=namespace|type;
个中namespace暗示创立定名空间的别号;而type暗示创立范例别号。比方,在.NETOffice使用中,经常会引进Microsoft.Office.Interop.Word.dll程序集,在引进定名空间时为了不烦琐的范例输出,我们一般为其创立别号以下:
usingMSWord=Microsoft.Office.Interop.Word;

如许,就能够在程序中以MSWord来取代Microsoft.Office.Interop.Word前缀,假如要创立Application对象,则能够是如许,
privatestaticMSWord.Applicationooo=newMSWord.Application();
一样,也能够创立范例的别号,用法为:
usingMyConsole=System.Console;
classUsingEx
{
publicstaticvoidMain()
{
MyConsole.WriteLine("使用了类的别号。");
}
}
而创立别号的另外一个主要的缘故原由在于统一cs文件中引进的分歧定名空间中包含了不异称号的范例,为了不呈现称号抵触能够经由过程设定别号来办理,比方:

<br>
using创立别号,无效的办理了这类大概的定名抵触,只管我们能够经由过程范例全称号来加以辨别,可是这明显不是最好的办理计划,using使得这一成绩水到渠成,不费涓滴工夫,同时在编码标准上看来也加倍的切合编码请求。
namespaceBoyspace
{
publicclassPlayer
{
publicstaticvoidPlay()
{
System.Console.WriteLine("Boysplayfootball.");
}
}
}
namespaceGirlspace
{
publicclassPlayer
{
publicstaticvoidPlay()
{
System.Console.WriteLine("Girlsplayviolin.");
}
}
}
4.强迫资本清算
4.1由来
要了解分明利用using语句强迫清算资本,就起首从懂得Dispose形式提及,而要懂得Dispose形式,则应起首懂得.NET的渣滓接纳机制。这些明显不是本文所能完成的弘论,我们只必要起首明白的是.NET供应了Dispose形式来完成显式开释和封闭对象的才能。
Dispose形式

Dispose形式是.NET供应的一种显式清算对象资本的商定体例,用于在.NET中开释对象封装的非托管资本。由于非托管资本不受GC把持,对象必需挪用本人的Dispose()办法来开释,这就是所谓的Dispose形式。从观点角度来看,Dispose形式就是一种强迫资本清算所要恪守的商定;从完成角度来看,Dispose形式就是让要一个范例完成IDisposable接口,从而使得该范例供应一个私有的Dispose办法。

本文不再会商怎样让一个范例完成Dispose形式来供应显现清算非托管资本的体例,而将注重会合在怎样以using语句来烦琐的使用这类完成了Dispose形式的范例的资本清算体例。我们在内存办理与渣滓接纳章节将有具体的会商。
using语句供应了强迫清算对象资本的便利操纵体例,同意指定什么时候开释对象的资本,其典范使用为:
using(Fontf=newFont("Verdana",12,FontStyle.Regular))
{
//实行文本绘制操纵
Graphicsg=e.Graphics;
Rectanglerect=newRectangle(10,10,200,200);
g.DrawString("Tryfinallydisposefont.",f,Brushes.Black,rect);
}//运转停止,开释f对象资本
在上述典范使用中,using语句在停止时会主动挪用欲被扫除对象的Dispose()办法。因而,该Font对象必需完成IDispose接口,才干利用using语句强迫对象清算资本。我们检察其范例界说可知:
publicsealedclassFont:MarshalByRefObject,ICloneable,ISerializable,IDisposable
Font范例切实其实完成了IDisposeable接口,也就具有了显现接纳资本的才能。但是,我们并未从上述代码中,看出任何利用Dispose办法的千丝万缕,这正式using语句带来的烦琐的地方,实在质事实如何呢?

4.2本色
要想懂得using语句的实行实质,懂得编译器在面前做了哪些四肢举动,就必需回回到IL代码中来揭密才行:
.methodpublichidebysigstaticvoidMain()cilmanaged
{
.entrypoint
//代码巨细40(0x28)
.maxstack4
.localsinit([0]class[System.Drawing]System.Drawing.Fontf,
[1]boolCS$4$0000)
IL_0000:nop
IL_0001:ldstr"Verdana"
IL_0006:ldc.r412.
IL_000b:ldc.i4.0
IL_000c:newobjinstancevoid[System.Drawing]System.Drawing.Font::.ctor(string,float32,
valuetype[System.Drawing]System.Drawing.FontStyle)
IL_0011:stloc.0
.try
{
……部分省略……
}//end.try
finally
{
……部分省略……
IL_001f:callvirtinstancevoid[mscorlib]System.IDisposable::Dispose()
IL_0024:nop
IL_0025:endfinally
}//endhandler
IL_0026:nop
IL_0027:ret
}//endofmethodUsingDispose::Main
明显,编译器在主动将using天生为try-finally语句,并在finally块中挪用对象的Dispose办法,来清算资本。
在.NET标准中,微软倡议开放职员在挪用一个范例的Dispose()大概Close()办法时,将其放在非常处置的finally块中。依据下面的剖析我们可知,using语句恰是隐式的挪用了范例的Dispose办法,因而以下的代码和下面的示例是完整等效的:
Fontf2=newFont("Arial",10,FontStyle.Bold);
try
{
//实行文本绘制操纵

Graphicsg=newGraphics();
Rectanglerect=newRectangle(10,10,200,200);
g.DrawString("Tryfinallydisposefont.",f2,Brushes.Black,rect);
}
finally
{
if(f2!=null)
((IDisposable)f2).Dispose();
}
4.3划定规矩
·using只能用于完成了IDisposable接口的范例,克制为不撑持IDisposable接口的范例利用using语句,不然会呈现编译时毛病;
·using语句合用于清算单个非托管资本的情形,而多个非托管对象的清算最好以try-finnaly来完成,由于嵌套的using语句大概存在埋没的Bug。内层using块激发非常时,将不克不及开释外层using块的对象资本。
·using语句撑持初始化多个变量,但条件是这些变量的范例必需不异,比方:
using(Penp1=newPen(Brushes.Black),p2=newPen(Brushes.Blue))
{
//
}
不然,编译将不成经由过程。不外,仍是有变通的举措来办理这一成绩,缘故原由就是使用using语句的范例一定完成了IDisposable接口,那末就能够以上面的体例来完成初始化操纵,
using(IDisposablefont=newFont("Verdana",12,FontStyle.Regular),pen=newPen(Brushes.Black))
{
floatsize=(fontasFont).Size;
Brushbrush=(penasPen).Brush;
}
另外一种举措就是以利用try-finally来完成,不论初始化的对象范例是不是分歧。
·Dispose办法用于清算对象封装的非托管资本,而不是开释对象的内存,对象的内存仍然由渣滓接纳器把持。
·程序在到达using语句开端时加入using块,而假如抵达语句开端之前引进非常则有大概提早加入。
·using中初始化的对象,能够在using语句之前声明,比方:
Fontf3=newFont("Verdana",9,FontStyle.Regular);
using(f3)
{
//实行文本绘制操纵
}
5.结论
一个复杂的关头字,多种分歧的使用场所。本文从对照周全的角度,解释了using关头字在.NET中的多种用法,值得指出的是这类用法并不是完成于.NET的一切初级言语,本文的情形次要范围在C#中。

<br>

参考文献
(USA)JeffreyRichter,AppliedMicrosoft.NETFrameworkProgramming
(USA)BillWagner,EffectiveC#
小妖女 该用户已被删除
沙发
发表于 2015-1-18 23:21:24 | 只看该作者
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
活着的死人 该用户已被删除
板凳
发表于 2015-1-22 23:58:10 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
地板
发表于 2015-1-29 06:27:40 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
老尸 该用户已被删除
5#
发表于 2015-1-30 18:01:43 | 只看该作者
当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
简单生活 该用户已被删除
6#
发表于 2015-1-30 21:15:39 | 只看该作者
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
若相依 该用户已被删除
7#
发表于 2015-2-5 04:21:02 | 只看该作者
主流网站开发语言之PHPHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-2-6 16:40:29 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
因胸联盟 该用户已被删除
9#
发表于 2015-2-17 07:57:50 | 只看该作者
是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。
深爱那片海 该用户已被删除
10#
发表于 2015-2-19 09:47:56 | 只看该作者
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
小魔女 该用户已被删除
11#
 楼主| 发表于 2015-2-28 16:53:38 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
柔情似水 该用户已被删除
12#
发表于 2015-3-8 14:49:20 | 只看该作者
主流网站开发语言之PHPHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
admin 该用户已被删除
13#
发表于 2015-3-16 02:33:19 | 只看该作者
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
谁可相欹 该用户已被删除
14#
发表于 2015-3-22 18:41:02 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-6 22:01

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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