老尸 发表于 2015-1-16 22:34:59

ASP.NET网页编程之C# 3.0中新匿名范例特征初体验

另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。  在客岁PDC2005上,在公布C#2.0(C#Whidbey)的同时,微软也同时展现了它们在C#3.0上的一些企图。在提到一系列新的言语特征如言语集成查询(LINQ)等,Redmond同时也先容了一个新的特征--匿名范例。本文具体先容了匿名范例。

  匿名范例界说

  C#3.0标准将匿名范例形貌为从工具初始化器(objectinitializer)主动揣度和天生的元组范例。在你可以充实了解这必定义之前,你必要懂得"工具初始化器"的观点,它是匿名范例特征的基本。

  工具初始化器给一个工具的一个大概多个域大概属性指定值。这就意味着你能够经由过程一系列诸如{a=10,b=20}如许的赋值操纵指定某个工具的一系列属性。换句话来讲,一个匿名范例是本来不存在的,而且没有在代码中明白指定的。

  注重,编译器是在编译时创立匿名范例而非运转时。

  你能够经由过程ILDASM(IL分化器)来分化取得:

varp1=new{Name="A",Price=3};
  在编译时候,编译器利用工具初始化器揣度的属性来传见一个新的匿名范例。因此,新范例将会具有Name和Price的属性。Get和Set办法和保留这些属性的响应的公有变量,会主动的天生。在运转时,此范例的一个实例会被创立,这个实例的属性将会被设置为工具初始化器中指定的值。

  C#外部

  你大概很惊异的发明,你能够只界说一些属性的称号和它们的值,C#3.0会主动的从它们那边创立类。这是怎样做到的呢?反省一下编译器的处置吧。

  如许入手下手一行代码:

varp1=new{Name="A",Price=3};
  当C#3.0编译器碰到如许的一个哀求的时分,它将在背景将其转化成加倍分明的表达,以下:

class__Anonymous1
{
 privatestringname;
 privateintprice;

 publicstringName{get{returnname;}set{name=value;}}
 publicintPrice{get{returnprice;}set{price=value;}}
}
__Anonymous1p1=new__Anonymous1();
p1.Name="A";
pt.Price=3
  实例进修

  你必要安装VisualStudio2005和.NET2.0,然后你能够从这里下载到LINQ手艺的预览版本。

  假如你安装了VisualStudio2005,你能够看到在VisualC#下多了3个和LINQ预览有关的工程模板:LINQConsoleApplication,LINQWindowsApplication,和LINQLibrary。

  你能够如许创立一个利用匿名范例的工程:

  1.翻开VisualStudio2005编纂器,创立一个新工程,选择LINQConsole作为工程模板;

  2.将新工程定名为AnonTypes而且点击OK;

  3.在编纂器里输出以下代码:

//Program.cs
usingSystem;
usingSystem.Query;
usingSystem.Data.DLinq;

namespaceAnonTypes
{
 classProgram
 {
  staticvoidMain(string[]args)
  {
   varp1=new{Name="A",Price=3};
   Console.WriteLine("Name={0}
Price={1}",p1.Name,p1.Price);
   Console.ReadLine();
  }
 }
}
  4.编译程序

  5.实行程序,取得以下了局:

Name=A
Price=3
  假如你没有VisualStudio2005,你仍旧能够经由过程命令行来编译你的代码:

C:ProgramFilesLINQPreviewBinCsc.exe
/reference:"C:ProgramFilesLINQPreviewBinSystem.Data.DLinq.dll"
/reference:System.dll
/reference:"C:ProgramFilesLINQPreviewBinSystem.Query.dll"
/out:AnonTypes.exe/target:exeProgram.cs
  只管你没有明晰的在代码里界说一个类,可是C#编译器主动做了以下事情:

  1.剖析范例

  2.创立一个新的类(具有name和price属性)

  3.利用这个类来初始化一个新工具

  4.将传来的参数指定给工具
<P>  深切剖析代码

  为了懂得编译器怎样创立一个新类的,翻开ILDASM(在C:ProgramFilesMicrosoftVisualStudio8SDKv2.0Bin下)而且选择比来的编译程序集,AnonTypes.exe。翻开树状视图,你能够看到如所示的视图:



  假如你细心看,ILDASM展现了一个匿名范例"<Projection>f__0"是怎样被创立的。和类同时被创立的是公有变量_Name和_Price。对这两个变量的Get和Set办法也同时被创立,他们也具有属性Name和Price。

  双击任何办法大概变量来看的分明一些,如你点击Name属性,你将会看到以下代码:

.propertyinstancestringName()
{
.getinstancestringAnonTypes.Program/
<Projection>f__0::get_Name()
.setinstancevoidAnonTypes.Program/
<Projection>f__0::set_Name(string)
}//endofproperty<Projection>f__0::Name
  多个匿名范例

  假如你创立了多个类似的匿名范例,C#编译器会伶俐的发明这一点,只天生一个类和它的两个实例,好比你输出以下代码:

usingSystem;
usingSystem.Query;

usingSystem.Data.DLinq;

namespaceAnonTypes
{
 classProgram
 {
  staticvoidMain(string[]args)
  {
   varp1=new{Name="A",Price=3};
   varp2=new{Name="A",Price=3};

   Console.WriteLine("Name={0}
Price={1}",p1.Name,p1.Price);
   Console.ReadLine();
  }
 }
}

  当你编译完并用ILDASM翻开的时分,布局以下所示:



  你能够看到,由于声明是相似的,以是C#只创立了一个匿名类,因此优化了程序。可是假如它们不是很相似的话,就会有两个匿名类。

  略微修正以上代码,以下:

new{Name="A",Price=3};
varp2=new{Name="A"};


  你能够看到,C#创立了两个类,<Projection>f__0and<Projection>f__1。

  总结

  这里我们能够看到,匿名范例为程序员供应了一种机制,该机制使得你不必明晰的声明类布局。并且,C#3.0编译器十分的智能化,在你具有多个类似的匿名范例时只创立一个匿名范例从而到达了优化程序的目标。c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。

飘灵儿 发表于 2015-1-18 16:46:30

JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。

灵魂腐蚀 发表于 2015-1-22 13:39:10

但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。

活着的死人 发表于 2015-1-31 07:12:21

ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。

海妖 发表于 2015-2-6 18:15:53

现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。

变相怪杰 发表于 2015-2-18 01:11:22

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

简单生活 发表于 2015-3-6 00:01:05

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.

山那边是海 发表于 2015-3-12 16:38:45

Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。

小魔女 发表于 2015-3-20 00:45:41

通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
页: [1]
查看完整版本: ASP.NET网页编程之C# 3.0中新匿名范例特征初体验