Visual C# 2.0泛型编程基础

来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-01 03:57 点击:
最近频繁的接触到泛型方面的问题,所以也不得不来学习一下了,开始主要是在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<T,S>类
   Test<string, int> t = new Test<string, int>("SHY520",22);

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

 /**//// <summary>
 /// 定义一个泛型类,该类有两个类型参数,分别是T,S
 /// http://pw.cnblogs.com
 /// </summary>
 /// <typeparam name="T">类型参数</typeparam>
 /// <typeparam name="S">类型参数</typeparam>
 public class Test<T,S>
 {
  //泛型类的类型参数可用于类成员
  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<T, S> { }

//正确的写法应该是
public class TestChild : Test<string, int>{ }
public class TestChild<T, S> : Test<T, S> { }
public class TestChild<T, S> : Test<String, int> { }

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

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

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

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

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 用C#制作屏幕捕获程序
    • .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上
    • 遍历ArrayList易犯错误
    • C#对XML操作:一个处理XML文件的类(1)
    • .NET简谈反射(动态调用)
    • 使用C#编写LED样式时钟控件
    • DataList嵌套问题 如何删除内层子DataList的记录
    • 怎样用C#实现完整文档打印功能
    • .NET简谈自定义事务资源管理器
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1
    using System;
    using System.Collections.Generic;
    using System.Text;

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

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

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