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

Reading number is top 10 articles
delphi OutLook界面实例
获得汉字字符串的首个拼音字母的缩写_[Asp.Net教程]
asp.net2.0服务器控件SiteMapPath的功能
C#中的GDI+概述
XML入门教程-XML 解析器_[XML教程]
sql,2005,分页,排名函数_mssql学习_编程技术
动态网页技术PHP和JS实现交互的一个例子_php资料_编程技术
HTML语言剖析(六)清单标记_[Html教程]
SQL Server 存储过程的分页方案比拼_[SQL Server教程]
PHP实例:实现文件上传的程序源码_[PHP教程]
Reading number is top 10 pictures
Wild animals melee moment of life and death1
Absolutely shocked. National geographic 50 animal photographys9
Hunan road lawenforcement vehicle pursue overload car caused the car turn and man is died
可爱的狗熊们
2015中美最新武器装备巅峰对决!
恶搞漫画1
六种更聪明的工作方法
鸡也看毛片
采访谢楠
两张抽象画
Download software ranking
Kung.Fu.Panda.2
Boxer's Top ten classic battle7
Tram sex maniac 2 (H) rar bag14
Tram sex maniac 2 (H) rar bag15
Eclipse 4.2.2 For Win64
WebService在.NET中的实战应用教学视频 → 第3集
Tram sex maniac 2 (H) rar bag5
Tram sex maniac 2 (H) rar bag7
Tram sex maniac 2 (H) rar bag9
Unix video tutorial18
delv published in(发表于) 2014/1/6 9:07:43 Edit(编辑)
Visual,C#,2.0泛型编程基础_[Asp.Net教程]

Visual,C#,2.0泛型编程基础_[Asp.Net教程]

Visual C# 2.0泛型编程基础_[Asp.Net教程]

 最近频繁的接触到泛型方面的问题,所以也不得不来学习一下了,开始主要是在MSDN的WebCast上去下载教学录象看的(李建忠老师的),本篇文章先介绍一下泛型入门方面的知识,希望能让刚开始学习泛型的朋友能够更快的入门,言归正传,首先我们来看一下泛型的基本概念。

  最显著的一点就是它参数化了类型,把类型作为参数抽象出来,从而使我们在实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型安全,更高的效率,不过在约束方面,它只支持显示的约束,这样在灵活性方面就显得不是那么好了。我觉得它之所以能够提供更高的效率是因为泛型在实例化的时候采用了"on-demand"的模式,即按需实例化,发生在JIT(Just In Time)编译时。

  下面来看如何定义一个泛型类,很简单,你只需要意识到一点,在这里,类型已经被参数化了:


using System;
using System.Collections.Generic;
using System.Text;

namespace GenericTest
{
 class Program
 {
  static void Main(string[] args)
  {
   //使用string,int来实例化Test
   Test t = new Test("SHY520",22);

   //调用泛型类中的方法
   t.SetValue();
  }
 }

 /**////
 /// 定义一个泛型类,该类有两个类型参数,分别是T,S
 /// http://pw.cnblogs.com
 ///

 /// 类型参数
 /// 类型参数
 public class Test
 {
  //泛型类的类型参数可用于类成员
  private T name;
  private S age;

  public Test(T Name,S Age)
  {
   this.name = Name;
   this.age = Age;
  }

  public void SetValue()
  {
   Console.WriteLine(name.ToString());
   Console.WriteLine(age.ToString());
  }
 }
}

  上面的例子不是很恰当,目的是让初学泛型的你了解一下泛型的定义及实例化方法,如上,我们定义了一个泛型类,那么如何实现泛型类的继承呢?这里需要满足下面两点中的任何一点即可:

  1、泛型类继承中,父类的类型参数已被实例化,这种情况下子类不一定必须是泛型类;

  2、父类的类型参数没有被实例化,但来源于子类,也就是说父类和子类都是泛型类,并且二者有相同的类型参数;


//如果这样写的话,显然会报找不到类型T,S的错误
public class TestChild : Test { }

//正确的写法应该是
public class TestChild : Test{ }
public class TestChild : Test { }
public class TestChild : Test { }

  接着我们来看看泛型接口,其创建以及继承规则和上面说的泛型类是一样的,看下面的代码:


public interface IList
{
 T[] GetElements();
}
public interface IDictionary
{
 void Add(K key, V value);
}

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

  在来看一下泛型委托,首先我们定义一个类型参数为T的委托,然后在类中利用委托调用方法:


using System;
using System.Collections.Generic;
using System.Text;

namespace GenericTest
{
 //定义一个委托,类型参数为T,返回值类型T
 //泛型委托支持在返回值和参数上应用类型参数
 delegate string GenericDelete(T value);

 class test
 {
  static string F(int i) { return "SHY520"; }
  static string G(string s) { return "SHY520"; }

  static void Main(string[] args)
  {
   GenericDelete G1 = G;
   GenericDelete G2 = new GenericDelete(F);
  }
 }
}

  我们再来看泛型方法,C#的泛型机制只支持在方法申明上包含类型参数,也即是泛型方法。特别注意的是,泛型不支持在除了方法以外的其他类/接口成员上使用类型参数,但这些成员可以被包含在泛型类型中,并且可以使用泛型类型的类型参数。还有一点需要说的就是,泛型方法可以在泛型类型中,也可以存在于非泛型类型中。下面我们分别看一下泛型类型的申明,调用,重载和覆盖。


using System;
using System.Collections.Generic;
using System.Text;

namespace GenericTest
{
 class GenericClass
 {
  //申明一个泛型方法
  public T getvalue(T t)
  {
   return t;
  }

  //调用泛型方法
  //注意:在调用泛型方法时,对泛型方法的类型参数实例化
  public int useMethod()
  {
   return this.getvalue(10);
  }

  //重载getvalue方法
  public int getvalue(int i)
  {
   return i;
  }
 }

 //下面演示覆盖
 //要注意的是,泛型方法被覆盖时,约束被默认继承,不需要重新指定约束关系
 abstract class Parent
 {
  public abstract K TEST(K k, V v) where K : V;
 }

 class Child : Parent
 {
  public override T TEST(T t, S s)
  {
   return t;
  }
 }
}

  最后我们来看一下泛型中的约束:

  C#中的泛型只支持显示的约束,因为这样才能保证C#所要求的类型安全,但显示的约束并非时必须的,如果不加约束,泛型类型参数将只能访问System.Object类型中的公有方法。“显式约束”由where子句表达,可以指定“基类约束”,“接口约束”,“构造器约束”,“值类型/引用类型约束”共四种约束。下面的例子来源于李建忠老师的讲座PPT。

  1、基类约束:


class A { public void F1() {} }
class B { public void F2() {} }
class C
where S: A // S继承自A
where T: B // T继承自B
{
 // 可以在类型为S的变量上调用F1,
 // 可以在类型为T的变量上调用F2
}

  2、接口约束


interface IPrintable { void Print(); }
interface IComparable { int CompareTo(T v);}
interface IKeyProvider { T GetKey(); }
class Dictionary
where K: IComparable
where V: IPrintable, IKeyProvider
{
 // 可以在类型为K的变量上调用CompareTo,
 // 可以在类型为V的变量上调用Print和GetKey
}

  3、构造器约束


class A { public A() { } }
class B { public B(int i) { } }
class C
where T : new()
{
 //可以在其中使用T t=new T();
}
C c=new C(); //可以,A有无参构造器
C c=new C(); //错误,B没有无参构造器

  4、值/引用类型约束


public struct A { }
public class B { }
class C
where T : struct
{
 // T在这里面是一个值类型
}
C
c=new C(); //可以,A是一个值类型
C c=new C(); //错误,B是一个引用类型
作者:pw 来源:博客园





添加到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.