最显著的一点就是它参数化了类型,把类型作为参数抽象出来,从而使我们在实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型安全,更高的效率,不过在约束方面,它只支持显示的约束,这样在灵活性方面就显得不是那么好了。我觉得它之所以能够提供更高的效率是因为泛型在实例化的时候采用了"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.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
public class TestChild
接着我们来看看泛型接口,其创建以及继承规则和上面说的泛型类是一样的,看下面的代码:
public interface IList
{
T[] GetElements();
}
public interface IDictionary
{
void Add(K key, V value);
}
// 泛型接口的类型参数要么已实例化
// 要么来源于实现类声明的类型参数
class List
{
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
class test
{
static string F(int i) { return "SHY520"; }
static string G(string s) { return "SHY520"; }
static void Main(string[] args) 【VisualC#2.0泛型编程基础】相关文章: 儿童舞蹈教程:国标新手上路03-23 2021湖北黄冈市浠水县基层医疗卫生机构专项招聘医务人员资格审查公告03-23 盐阜大众报报业集团(盐城)公开招聘《东方生活报》编辑记者的公告 2月25日到3月3日报名03-23 5月11日开始报名!2023年内蒙古鄂尔多斯市乌审旗秋季幼升小入学条件和流程公布03-23 初中学校德育课程整合实施探究03-23 2021医疗招聘考试医基资料:你的肺还“听话”不?03-23 VOA基础听力词汇 V03-23 2015年美国化学工程专业排名03-23 VOA慢速英语:小型飞行恐龙与猫同大03-23
{
GenericDelete
GenericDelete
}
}
}
