All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
2.0里用DIV层元素弹出窗体_.net资料_编程技术
ASP.NET Remoting体系结构(六)
将SSH与PHP相连接 确保传输数据的安全_[PHP教程]
什么是.net的接口和抽象类_[Asp.Net教程]
使用PHP程序来保护你的flash作品_[PHP教程]
在PWS上建立WAP网站_[XML教程]
ajax技术制作得在线歌词搜索功能_[AJAX教程]
c#判断数据NULL值的方法_[Asp.Net教程]
C#中利用process类调用外部程序以及执行dos命令_.net资料_编程技术
asp.net动态生成html页面(简明代码)_[Asp.Net教程]
Reading number is top 10 pictures
9.3阅兵全景图5-地空反舰导弹梯队
红楼梦金陵十二钗(1)
9.3阅兵全景图4-陸海空现代化兵种方阵梯队
Beauty ZhiHuiLin1
The household design, do not do bridal chamber a pity
如果我是导演...
A man's favorite things4
色狗系列
Go to the national museum3
The money of more than 100 countries and regions16
Download software ranking
尖东毒玫瑰A
双旗镇刀客B
The Bermuda triangle1
c#程序设计案例教程
卡丁车单机版
I'm come from Beijing1
Dance with duck(male prostitution)
传奇私服架设教程
Tram sex maniac 2 (H) rar bag17
Ashlynn Video2
aaa published in(发表于) 2013/12/18 8:27:19 Edit(编辑)
通过实例学习C#开发中的泛型_.net资料_编程技术

通过实例学习C#开发中的泛型_.net资料_编程技术

通过实例学习C#开发中的泛型_.net资料_编程技术-你的首页-uuhomepage.com

  C#中所谓泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。


  C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。


  C#泛型机制简介


  C#泛型能力由CLR在运行时支持,区别于C++的编译时模板机制,和java的编译时的“搽拭法”。这使得泛型能力可以在各个支持CLR的语言之间进行无缝的互操作。


  C#泛型代码在被编译为IL和元数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以“on-demand”的方式,发生在JIT编译时。


  C#泛型编译机制


  第一轮编译时,编译器只为Stack类型产生“泛型版”的IL代码和元数据,并不进行泛型类型的实例化,T在中间只充当占位符。


  JIT编译时,当JIT编译器第一次遇到Stack时,将用int类型替换“泛型版”IL代码与元数据中的T -- 进行泛型类型的实例化。


  CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码,但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。


  C#泛型的几个特点


  如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题。


  C#泛型类型携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反射技术。


  C#的泛型采用“基类、接口、构造器、值类型/引用类型”的约束方式来实现对类型参数的“显示约束”,提高了类型安全的同时,也丧失了C++模板基于“签名”的隐式约束所具有的高灵活性。


  C#泛型类与结构


  class C{} //合法


  class D:C{} //合法


  class E:C{} //合法


  class F:C{} //合法


  class G:C{} //非法


  C#除可单独声明泛型类型(包括类与结构)外,也可在基类中包含泛型类型的声明。但基类如果是泛型类,他的类型参数要么已实例化,要么来源子类(同样是泛型类型)声明的类型参数。


  泛型类型的成员


class C
  {
  public V f1; //声明字段
  public D f2; //作为其他泛型类型 的参数
  public C
  {
  this.f1 = x;
  }
  }


  泛型类型的成员可以使用泛型类型声明中的类型参数。但类型参数如果没有任何约束,则只能在该类型上使用从System.Object继承的共有成员。


  泛型接口


interface IList
  {
  T[] GetElements();
  }
  interface IDictionary
  {
  void Add(K key,V value);
  }
  //泛型接口的类型参数要么已实例化
  //要么来源于实现类声明的类型参数
  class List:IList,IDictionary
  {
  public T[] GetElements{}
  {
  return null;
  }
  public void Add(int index,T value){}
  }


  泛型委托


delegate bool Predicate(T value);
  class X
  {
  static bool F(int i){...}
  static bool G(string s){...}
  static void Main()
  {
  Predicate p2 = G;
  Predicate p1 = new Predicate(F);
  }
  }


  泛型委托支持返回值和参数哂纳感应用参数类型,这些参数类型同样可以附带合法的约束。


  泛型方法的简介


  C#泛型机制只支持“在方法声明上包含类型参数” -- 即泛型方法。


  C#泛型机制不支持在除方法外的其他成员(包括属性、事件、索引器、构造器、析构器)的声明上包含类型参数,但这些成员本身可以包含在泛型类型中,并使用泛型类型的类型参数。


  泛型方法既可以包含在泛型类型中,也可以包含在非泛型类型中。


  泛型方法的声明与调用


public class Finder
  {
  // 泛型方法的声明
  public static int Find(T[] items,T item)
  {
  for(int i=0;i
  {
  if(items[i].Equals(item)
  {
  return i;
  }
  }
  return -1;
  }
  }
  // 泛型方法的调用
  int i = Finder.Find(new int[]{1,3,4,5,6,8,9},6);


  泛型编程


  泛型方法的重载


class MyClass
  {
  void F1(T[] a,int i); // 不可以构成重载方法
  void F1(U[] a,int i);
  void F2(int x); // 可以构成重载方法
  void F2(int x);
  void F3(T t) where T : A; // 不可以构成重载方法
  void F3(T t) where T : B;
  }


  泛型方法的重写



  abstract class Base
  {
  public abstract T F(T t,U u) where U : T;
  public abstract T G(T t) where U : IComparable;
  }
  class Derived:Base
  {
  // 合法的重写,约束被默认继承
  public override X F(X,Y)(X x,Y y){}
  // 非法的重写,指定任何约束都是多余的
  public override T G(T t) where T : Comparable{}
  }





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.