仓酷云

标题: ASP.NET编程:Visual C#泛型进修之泛型先容 [打印本页]

作者: 山那边是海    时间: 2015-1-16 22:39
标题: ASP.NET编程:Visual C#泛型进修之泛型先容
捆绑编译器。用户不需要受制于厂家,自己就能将程序在新平台上编译运行。除了牛B轰轰的linux,估计也没有系统捆绑c/c++的编译器,而且许多新平台都无法支持复杂的c/c++编译器在上面直接运行。visual  甚么是泛型

  一品种型占位符,或称之为范例参数。我们晓得在一个办法中,一个变量的值能够作为参数,但实在这个变量的范例自己也能够作为参数。泛型同意我们在挪用的时分再指定这个范例参数是甚么。在.net中,泛型可以给我们带来的两个分明优点是――范例平安和削减装箱、拆箱。

  范例平安和装箱、拆箱

  作为一品种型参数,泛型很简单给我们带来范例平安。而在之前,在.net1.1中我们要完成范例平安能够如许做:

//假定你有一团体员汇合

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

//假定你有一团体员汇合

publicclassPersonCollection:IList
{
 ...
 privateArrayList_Persons=newArrayList();
 publicPersonthis[intindex]
 {get{return(Person)_Persons[index];}}

 publicintAdd(Personitem)
 {_Persons.Add(item);
  return_Persons.Count-1;}

 publicvoidRemove(Personitem)
 {_Persons.Remove(item);}

 objectIList.this[intindex]
 {get{return_Persons[index];}
 set{_Persons[index]=(Person)value;}}

 intIList.Add(objectitem)
 {returnAdd((Person)item);}

 voidIList.Remove(objectitem)
 {Remove((Person)item);}
  ...
}
  上述代码次要接纳了显性接口成员(explicitinterfacememberimplementation)手艺,可以完成范例平安,但成绩是:

  ・发生反复代码。假定你另有一个Dog类汇合,其功效不异,但为了范例平安,你必需要Copy一份代码,如许便使程序反复代码增添,劈面对变更的时分,更难保护。

publicclassDogCollection:IList
{
 ...
 privateArrayList_Dogs=newArrayList();
 publicDogthis[intindex]
 {get{return(Dog)_Dogs[index];}}

 publicintAdd(Dogitem)
 {_Dogs.Add(item);
  return_Dogs.Count-1;}

 publicvoidRemove(Dogitem)
 {_Dogs.Remove(item);}

 objectIList.this[intindex]
 {get{return_Dogs[index];}
 set{_Dogs[index]=(Dog)value;}}

 intIList.Add(objectitem)
 {returnAdd((Dog)item);}

 voidIList.Remove(objectitem)
 {Remove((Dog)item);}
  ...
}
  假如在泛型中,要完成范例平安,你不必要拷贝任何代码,你仅仅必要如许做:

List<Person>persons=newList<Person>();
persons.Add(newPerson());
Personperson=persons[0];
List<Dog>dogs=newList<Dog>();
dogs.Add(newDog());
Dogdog=dogs[0];

  ・关于值范例的工具仍是必要分外的装箱、拆箱。实在关于传统的汇合来讲,只需个中的包括的内容触及到值范例,就不成制止必要装箱、拆箱。请看上面的例子。

publicclassIntCollection:IList
{
 ...
 privateArrayList_Ints=newArrayList();
 publicintthis[intindex]
 {get{return(int)_Ints[index];}}

 publicintAdd(intitem)
 {_Ints.Add(item);
  return_Ints.Count-1;}

 publicvoidRemove(intitem)
 {_Ints.Remove(item);}
  objectIList.this[intindex]
  {get{return_Ints[index];}
  set{_Ints[index]=(int)value;}}

 intIList.Add(objectitem)
 {returnAdd((int)item);}

 voidIList.Remove(objectitem)
 {Remove((int)item);}
  ...
 }

 staticvoidMain(string[]args)
 {IntCollectionints=newIntCollection();
  ints.Add(5);//装箱
  inti=ints[0];//拆箱
 }
  大批装箱、拆箱对功能的影响不年夜,可是假如汇合的数据量十分年夜,对功能仍是有必定影响的。泛型可以制止对值范例的装箱、拆箱操纵,您能够经由过程剖析编译后的IL失掉印证。

staticvoidMain()

{
 List<int>ints=newList<int>();
 ints.Add(5);//不必装箱
 inti=ints[0];//不必拆箱
}
  泛型的完成

  ・泛型办法

staticvoidSwap<T>(refTa,refTb)
{Console.WriteLine("YousenttheSwap()methoda{0}",
 typeof(T));
 Ttemp;
 temp=a;
 a=b;
 b=temp;
}
  ・泛型类、布局

publicclassPoint<T>
{
 privateT_x;
 privateT_y;
 publicTX
 {get{return_x;}
  set{_x=value;}}

 publicTY
 {get{return_y;}
  set{_y=value;}}

 publicoverridestringToString()
 {returnstring.Format("[{0},{1}]",_x,_y);}
}
  泛型的Where

  泛型的Where可以对范例参数作出限制。有以下几种体例。

  ・whereT:struct限定范例参数T必需承继自System.ValueType。
  
  ・whereT:class限定范例参数T必需是援用范例,也就是不克不及承继自System.ValueType。

  ・whereT:new()限定范例参数T必需有一个缺省的机关函数

  ・whereT:NameOfClass限定范例参数T必需承继自某个类或完成某个接口。

  以上这些限制能够组合利用,好比:publicclassPoint<T>whereT:class,IComparable,new()

  泛型的机制

  ・机制:

  C#泛型代码在被编译为IL代码和有数据时,接纳特别的占位符来暗示泛型范例,并用专有的IL指令撑持泛型操纵。而真实的泛型实例化事情以"on-demand"的体例,产生在JIT编译时。

  ・编译机制:

  1.第一轮编译时,编译器只为Stack<T>(栈算法)范例发生“泛型版”的IL代码与元数据-----其实不举行泛型范例的实例化,T在两头只充任占位符

  2.JIT编译时,当JIT编译器第一次碰到Stack<int>时,将用int交换“泛型版”IL代码与元数据中的T---举行泛型范例的实例化。CLR为一切范例参数为“援用范例”的泛型范例发生统一份代码;但假如范例参数为“值范例”,对每个分歧的“值范例”,CLR将为其发生一份自力的代码。

  泛型的一些成绩

  ・不撑持操纵符重载。我只晓得这么多了

  范型的意义

  泛型的意义安在?范例平安和削减装箱、拆箱并非泛型的意义,而是泛型带来的两个优点罢了(也许在.net泛型中,这是最分明的优点了)。泛型的意义在于――把范例作为参数,它完成了代码之间的很好的横向接洽,我们晓得承继为代码供应了一种从上往下的纵向接洽,但泛型供应了便利的横向接洽(从某种水平上说,它和AOP在头脑上有相通的地方)。在PersonCollection例子中,我们晓得Add()办法和Remove()办法的参数范例不异,但我们明白没法告知我们的程序这一点,泛型供应了一种机制,让程序晓得这些。事理固然复杂,但如许的机制也许能给我们的程序带来一些深远的变更吧。归根到底,Java跨平台可以,但是要重新编写代码,否则还分什么J2EE/J2SE/J2ME呢!
作者: 深爱那片海    时间: 2015-1-19 20:42
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
作者: 冷月葬花魂    时间: 2015-1-19 20:42
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
作者: 愤怒的大鸟    时间: 2015-1-25 16:52
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
作者: 若相依    时间: 2015-2-3 11:18
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
作者: 小妖女    时间: 2015-2-8 20:24
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
作者: 飘飘悠悠    时间: 2015-2-26 04:42
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
作者: 不帅    时间: 2015-3-15 22:34
ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。
作者: 爱飞    时间: 2015-3-22 17:24
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2