C#2.0中泛型编程初级入门教程

C#2.0中泛型编程初级入门教程,第1张

C#2.0中泛型编程初级入门教程,第2张

2005年底,微软正式发布了C# 2.0。与C# 1.x相比,新版本有很多新特性,其中最重要的是对泛型的支持。通过泛型,我们可以在不使用实际数据类型的情况下定义类型安全的数据结构。这可以显著提高性能并获得更高质量的代码。泛型并不是什么新东西。在功能上类似于C++的模板。模板在C++中已经存在很多年了,在C++中也有大量成熟的应用。

讨论了泛型使用中的一般问题,如为什么使用泛型、泛型的编写方法、泛型中数据类型的约束、泛型中使用静态成员需要注意的问题、泛型中的方法重载问题、泛型方法等。通过这些,我们可以大致了解泛型,掌握它的一般应用,写出更简单、更通用、更高效的应用系统。

什么是泛型?

我们在编写程序的时候,经常会遇到两个模块的功能非常相似,只是一个模块处理int数据,另一个模块处理string数据或者其他用户自定义的数据类型。但是,我们别无选择,只能编写多个方法来处理每个数据类型,因为方法的参数类型是不同的。难道没有办法把一个通用的数据类型传入方法,这样代码就可以合并了吗?泛型的出现致力于解决这个问题。看完这篇文章,你会对泛型有更深的理解。

为什么使用泛型?

为了理解这个问题,我们先来看下面这段代码,它省略了一些内容,但是它的作用是实现一个栈,这个栈只能处理int数据类型:

public类Stack
{
private int[]m _ item;
public int Pop(){...}
public void Push(int item){...}
public Stack(int I)
{
this . m _ item = new int[I];
}
}

上面的代码运行得很好,但是当我们需要一个堆栈来存放字符串类型的时候,我们该怎么办呢?很多人会想到复制上面的代码,把int改成string。当然这样做是没有问题的,但是好的程序是不会这样做的,因为他觉得如果以后需要一个长型和节点型的栈该怎么办。要不要再抄一遍?优秀的程序员会考虑使用通用数据类型对象来实现这个堆栈:

公共类堆栈
{
私有对象[]m _ item;
公共对象Pop(){...}
公共作废推送(对象项目){...}

public Stack(int I)
{
this . m _ item = new[I];
}

}

这一叠写得好。它非常灵活,可以接收任何数据类型,可以说是一劳永逸。但总的来说,它并非没有缺陷,主要表现在:

Stack处理值类型时,会有装箱和折叠操作,会在托管堆上分配和回收大量变量。如果数据量很大,性能损失会很严重。
在处理引用类型时,虽然没有装箱和折叠操作,但是会使用数据类型的强制转换,增加了处理器的负担。

数据类型转换有更严重的问题(假设stack是Stack的实例):

node 1 x = new node 1();
堆栈。推(x);
Node2 y = (Node2)堆栈。pop();

上面的代码在编译时完全没问题,但是由于推送了一个Node1类型的数据,但是在Pop时要求转换为Node2类型,程序运行时会出现类型转换异常,但是逃脱了编译器的检查。

针对对象类型栈存在的问题,我们引入了泛型,它可以很好地解决这些问题。Generic使用传递的数据类型T代替object,在类实例化时指定T的类型,运行时自动编译成本地代码,大大提高了运行效率和代码质量,保证了数据类型安全。

使用泛型

下面是用泛型重写上面的栈,用一个通用的数据类型T作为占位符,等待实例化时用一个实际类型替换。让我们来看看泛型的威力:

public类Stack
{
private T[]m _ item;
public T Pop(){...}
public void Push(T item){...}

public Stack(int I)
{
this . m _ item = new T[I];
}
}

类的写法不变,但通过引入通用数据类型T,可以应用于任何数据类型,类型是安全的。该类的调用方法:

//实例化只能容纳int类型的类

栈a =新栈(100);
a .推送(10);
a . Push(" 8888 ");//这一行不会编译,因为A类只接收int
int x = a.Pop()类型的数据;

//实例化只能容纳类型字符串的类

栈b =新栈(100);
b . Push(10);//此行编译失败,因为B类只接收string
b.Push("8888 ")类型的数据;
string y = b . Pop();

此类与object实现的类有很大不同:

1.他是类型安全的。int类型的栈实例化时,string类型的数据无法处理,其他数据类型也无法处理。

2.无需打包和折叠盒子。实例化该类时,会根据传入的数据类型生成本地代码。本地代码的数据类型已经确定,所以不需要装箱和折叠。

3.不需要类型转换。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#2.0中泛型编程初级入门教程

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情