ASP.NET网站制作之C# 3.0 新特征:扩大办法初探
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.net老师不吝赐教,为小弟这一批迷途的羊羔指一条阳光之道!您也知道:学习技术如果只有一个人摸索,那是一件多么痛苦的事情!还有,如果万辛能得名师或长者指点,那又是多么一件幸福和快乐的事情! C#3.0中一个冲动民气的特征就是扩大办法:你可使用实例办法的语法来挪用静态办法。本文细心论述了这一新特征而且给出了几个响应的例子。声明扩大办法
扩大办法的举动和静态办法长短常相似的,你只能在静态类中声明它们。为声明一个扩大办法,你必要给该办法的第一个参数指定this关头字,以下例:
//Program.cs
publicstaticclassEMClass
{
publicstaticintToInt32Ext(thisstrings)
{
returnInt32.Parse(s);
}
publicstaticintToInt32Static(strings)
{
returnInt32.Parse(s);
}
}
classProgram
{
staticvoidMain(string[]args)
{
strings="9";
inti=s.ToInt32Ext();//LINEA
Console.WriteLine(i);
intj=EMClass.ToInt32Static(s);//LINEB
Console.WriteLine(j);
Console.ReadLine();
}
}
为编译如上代码,你必要安装VisualStudio2005和LINQ的预览版。假如你已安装了VS2005,那末你将在VisualC#的LINQPreview里看到三个新的工程模板:LINQ命令行使用程序,LINQ窗口程序和LINQ库。以下操纵编译代码:
1.翻开VS2005编纂器,创立一个新工程,在新建工程窗口当选择LINQConsole作为工程模板。
2.将工程定名为ExtensionMethods,点击Ok。
3.将如上代码键进编纂器。
4.按下F5编译工程并运转。
假如你只是安装了.NET2.0,那末你能够运转命令行编译器:
Csc.exe/reference:"C:ProgramFilesLINQPreviewBin
System.Data.DLINQ.dll"
/reference:C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.dll
/reference:"C:ProgramFilesLINQPreviewBinSystem.Query.dll"
/reference:"C:ProgramFilesLINQPreviewBinSystem.Xml.XLINQ.dll"
/target:exeProgram.cs
就像你在如上代码里所看到的那样,扩大办法(ToInt32Ext)和一般的静态办法(ToInt32Static)的分歧在于:
1.扩大办法的第一个参数有一个this关头字,而静态办法不会在它的参数声明里有this关头字。
2.当利用扩大办法的是哦户,利用this关头字声明的的参数没有举行传送。在下面的例子里,LineA就是一个利用扩大办法ToInt32Ext的例子。不必要将参数传送给它。当静态办法在利用的时分,是不克不及疏忽失落任何的参数的。一切的参数必需传送进进函数。LineB就是一个例子。
3.扩大办法只能在静态类中界说。关于静态办法,这其实不成为一个请求,由于静态办法能够在一个静态类或一般类中存在。
4.扩大办法只能针对实例挪用。
扩大办法,只管实质上仍是静态的,可是只能针对实例挪用。假如在一个类中挪用它们将会激发编译毛病。挪用它们的类实例是由声明中的第一个参数决意的,就是有关头字this润色的谁人。
在IL外部
假如你寓目IL里对以上代码的剖析了局,你将会看到以下图的了局:
以下是IL关于扩大办法ToInt32Ext的剖析:
.methodpublichidebysigstaticint32ToInt32Ext(strings)cilmanaged
{
.custominstancevoidSystem.Runtime
.CompilerServices.ExtensionAttribute::.ctor()=(01000000)
//Codesize12(0xc)
.maxstack1
.localsinit(int32CSCODE_REPLACEMENT200)
IL_0000:nop
IL_0001:ldarg.0
IL_0002:callint32System.Int32::Parse(string)
IL_0007:stloc.0
IL_0008:br.sIL_000a
IL_000a:ldloc.0
IL_000b:ret
}//endofmethodEMClass::ToInt32Ext
以下代码是IL对静态办法ToInt32Static的剖析:
.methodpublichidebysigstaticint32ToInt32Static(strings)cilmanaged
{
//Codesize12(0xc)
.maxstack1
.localsinit(int32CSCODE_REPLACEMENT300)
IL_0000:nop
IL_0001:ldarg.0
IL_0002:callint32System.Int32::Parse(string)
IL_0007:stloc.0
IL_0008:br.sIL_000a
IL_000a:ldloc.0
IL_000b:ret
}//endofmethodEMClass::ToInt32Static
.custominstancevoid:本行代码申明本办法只能针对实例利用。
System.Runtime.CompilerServices.ExtensionAttribute::.ctor()=(01000000):本行代码申明扩大特征被利用了。
<P> 扩大办法转换
下表显现了在编译时举行的办法转换
办法代码编译为1expr.identifier()identifier(expr)2expr.identifier(args)identifier(expr,args)3expr.identifier<typeargs>()identifier<typeargs>(expr)4expr.identifier<typeargs>(args)identifier<typeargs>(expr,args)
假如你在ILDASM中反省main办法的代码,它将会以下显现:
.methodprivatehidebysigstaticvoidMain(string[]args)cilmanaged
{
.entrypoint
//Codesize42(0x2a)
.maxstack1
.localsinit(strings,
int32i,
int32j)
IL_0000:nop
IL_0001:ldstr"9"
IL_0006:stloc.0
IL_0007:ldloc.0
IL_0008:callint32ExtensionMethods.EMClass::ToInt32Ext(string)
IL_000d:stloc.1
IL_000e:ldloc.1
IL_000f:callvoidSystem.Console::WriteLine(int32)
IL_0014:nop
IL_0015:ldloc.0
IL_0016:callint32ExtensionMethods.EMClass::
ToInt32Static(string)
IL_001b:stloc.2
IL_001c:ldloc.2
IL_001d:callvoidSystem.Console::WriteLine(int32)
IL_0022:nop
IL_0023:callstringSystem.Console::ReadLine()
IL_0028:pop
IL_0029:ret
}//endofmethodProgram::Main
IL_0008:callint32ExtensionMethods.EMClass::
ToInt32Ext(string)
这里标明办法转换(expr.identifier()<-->identifier(expr))产生.
以是当你挪用inti=s.ToInt32Ext();,编译器外部举行操纵inti=EMClass.ToInt32Ext(s);那末,重写的重生会看成一个静态办法挪用来处置
标识符依照以下的按次剖析:
1.比来的包括的定名空间声明
2.每一个后继包括的定名空间声明
3.包括的编译单位
上面是办法的从高到低的优先级:
1.实例办法
2.在统一个定名空间里的扩大办法
3.在以后定名空间以外的扩大办法
为何利用扩大办法?
你大概会问:"为何有了一般的静态和实例类还必要利用扩大办法呢?"实在,复杂来讲就是为了便利。我来举个例子吧。假如你在已往的一段工夫内开辟了良多函数构成了一个库。那末当或人要用这个函数库的时分,他必需要晓得界说了所需的静态办法的类名。就像上面这个一样:
a=MyLibraryClass.
这里,IntelliSense将会弹出而且告知你可用函数的名字,你只必要选择你所必要的。然后键进你必要的办法名和相干参数。
a=MyLibraryClass.DesiredFunction(strName)
利用这类办法,你必需事前晓得哪一个库包括了你所要的哪一个函数和它的称号,利用扩大办法就纷歧样了:
a=strName.
这里,IntelliSense将会弹出,而且显现可使用哪些扩大办法。你只必要键进你必要的扩大办法:
a=strName.DesiredFunction()
这里不必给出所需的参数名来指定命据范例。
在工具实例中挪用静态办法
扩大办法供应了一个新的机制用来在工具实例上挪用静态办法。但和实例办法对照起来,它仍是在功效上有诸多限定,因而你应当守旧的利用它,次要将它哦可以在实例办法才能所不及的中央。
C#3.0并非一个正式的版本,以是它的尺度也没有最初定稿。因而,如许的格局也很有大概变更。今天去面试,被问到C#中的new关键字,看了那么多的书对new关键字还是有一定认识,回来又把new复习了一遍,发现了许多以前还不知道的细节。 ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。 ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。 由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。 关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。 这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
页:
[1]