仓酷云

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

[学习教程] ASP.NET网站制作之C# 3.0 新特征:扩大办法初探

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:35:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.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
{
 .custominstancevoid[System.Query]System.Runtime
 .CompilerServices.ExtensionAttribute::.ctor()=(01000000)
 //Codesize12(0xc)
 .maxstack1
 .localsinit([0]int32CSCODE_REPLACEMENT200)
 IL_0000:nop
 IL_0001:ldarg.0
 IL_0002:callint32[mscorlib]System.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([0]int32CSCODE_REPLACEMENT300)
 IL_0000:nop
 IL_0001:ldarg.0
 IL_0002:callint32[mscorlib]System.Int32::Parse(string)
 IL_0007:stloc.0
 IL_0008:br.sIL_000a
 IL_000a:ldloc.0
 IL_000b:ret
}//endofmethodEMClass::ToInt32Static
  .custominstancevoid:本行代码申明本办法只能针对实例利用。

  [System.Query]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([0]strings,
 [1]int32i,
 [2]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:callvoid[mscorlib]System.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:callvoid[mscorlib]System.Console::WriteLine(int32)
 IL_0022:nop
 IL_0023:callstring[mscorlib]System.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复习了一遍,发现了许多以前还不知道的细节。
小魔女 该用户已被删除
沙发
发表于 2015-1-18 16:32:29 | 只看该作者
ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
透明 该用户已被删除
板凳
发表于 2015-1-22 13:08:40 来自手机 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
飘灵儿 该用户已被删除
地板
发表于 2015-1-31 06:52:14 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
第二个灵魂 该用户已被删除
5#
发表于 2015-2-6 18:05:37 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
老尸 该用户已被删除
6#
 楼主| 发表于 2015-2-17 23:39:19 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
柔情似水 该用户已被删除
7#
发表于 2015-3-12 16:37:46 | 只看该作者
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
精灵巫婆 该用户已被删除
8#
发表于 2015-3-12 16:37:46 | 只看该作者
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
admin 该用户已被删除
9#
发表于 2015-3-20 00:26:32 | 只看该作者
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-24 00:58

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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