最近频繁的接触到泛型方面的问题,所以也不得不来学习一下了,开始主要是在MSDN的WebCast上去下载教学录象看的(李建忠老师的),本篇文章先介绍一下泛型入门方面的知识,希望能让刚开始学习泛型的朋友能够更快的入门,言归正传,首先我们来看一下泛型的基本概念。
最显著的一点就是它参数化了类型,把类型作为参数抽象出来,从而使我们在实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型安全,更高的效率,不过在约束方面,它只支持显示的约束,这样在灵活性方面就显得不是那么好了。我觉得它之所以能够提供更高的效率是因为泛型在实例化的时候采用了"on-demand"的模式,即按需实例化,发生在JIT(Just In Time)编译时。
(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)下面来看如何定义一个泛型类,很简单,你只需要意识到一点,在这里,类型已经被参数化了:
using System;using System.Collections.Generic;using System.Text;namespace GenericTest{ class Program { static void Main(string[] args) { //使用string,int来实例化TestT,S类 Teststring, int t = new Teststring, int("SHY520",22); //调用泛型类中的方法 t.SetValue(); } } /**//// summary /// 定义一个泛型类,该类有两个类型参数,分别是T,S /// http://pw.cnblogs.com /// /summary /// typeparam name="T"类型参数/typeparam /// typeparam name="S"类型参数/typeparam public class TestT,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、父类的类型参数没有被实例化,但
using System;using System.Collections.Generic;using System.Text;namespace GenericTest{ class GenericClass { //申明一个泛型方法 public T getvalueT(T t) { return t; } //调用泛型方法 //注意:在调用泛型方法时,对泛型方法的类型参数实例化 public int useMethod() { return this.getvalueint(10); } //重载getvalue方法 public int getvalue(int i) { return i; } } //下面演示覆盖 //要注意的是,泛型方法被覆盖时,约束被默认继承,不需要重新指定约束关系 abstract class Parent { public abstract K TESTK, V(K k, V v) where K : V; } class Child : Parent { public override T TESTT, S(T t, S s) { return t; } }}
最后我们来看一下泛型中的约束:
(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)C#中的泛型只支持显示的约束,因为这样才能保证C#所要求的类型安全,但显示的约束并非时必须的,如果不加约束,泛型类型参数将只能访问System.Object类型中的公有方法。显式约束由where子句表达,可以指定基类约束,接口约束,构造器约束,值类型/引用类型约束共四种约束。下面的例子