泛型编程 C#.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:8 大小:176KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

泛型编程 C#.pdf

泛型编程C#.pdf

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

泛型编程:C#2.0中泛型编程初级入门教程疯狂代码http://www.crazycoder.cn/ĵ:http:/www.crazycoder.cn/DotNet/Article48264.html在2005年底微软公司正式发布了C#2.0和C#1.x相比新版本增加了很多新特性其中最重要是对泛型支持通过泛型我们可以定义类型安全数据结构而无需使用实际数据类型这能显著提高性能并得到更高质量代码泛型并不是什么新鲜东西他在功能上类似于C模板模板多年前就已存在C上了并且在C上有大量成熟应用本文讨论泛型使用般问题比如为什么要使用泛型、泛型编写思路方法、泛型中数据类型约束、泛型中静态成员使用要注意问题、泛型中思路方法重载问、泛型思路方法等通过这些使我们可以大致了解泛型并掌握泛型般应用编写出更简单、通用、高效应用系统什么是泛型我们在编写时经常遇到两个模块功能非常相似只是个是处理数据另个是处理数据或者其他自定义数据类型但我们没有办法只能分别写多个思路方法处理每个数据类型思路方法参数类型区别有没有种办法在思路方法中传入通用数据类型这样不就可以合并代码了吗?泛型出现就是专门解决这个问题读完本篇文章你会对泛型有更深了解为什么要使用泛型为了了解这个问题我们先看下面代码代码省略了些内容但功能是实现个栈这个栈只能处理数据类型:publicStack{privatem_item;publicPop{...}publicvoidPush(item){...}publicStack(i){this.m_item=[i];}}上面代码运行很好但是当我们需要个栈来保存类型时该如何办呢?很多人都会想到把上面代码复制份把改成不就行了当然这样做本身是没有任何问题但个优秀是不会这样做他想到若以后再需要long、Node类型栈该怎样做呢?还要再复制吗?优秀员会想到用个通用数据类型object来实现这个栈:publicStack{privateobjectm_item;publicobjectPop{...}publicvoidPush(objectitem){...}publicStack(i){this.m_item=[i];}}这个栈写不错他非常灵活可以接收任何数据类型可以说是劳永逸但全面地讲也不是没有缺陷主要表现在:当Stack处理值类型时会出现装箱、折箱操作这将在托管堆上分配和回收大量变量若数据量大则性能损失非常严重在处理引用类型时虽然没有装箱和折箱操作但将用到数据类型强制转换操作增加处理器负担在数据类型强制转换上还有更严重问题(假设stack是Stack个例子):Node1x=Node1;stack.Push(x);Node2y=(Node2)stack.Pop;上面代码在编译时是完全没问题但由于Push了个Node1类型数据但在Pop时却要求转换为Node2类型这将出现运行时类型转换异常但却逃离了编译器检查针对object类型栈问题我们引入泛型他可以优雅地解决这些问题泛型用用个通过数据类型T来代替object在类例子化时指定T类型运行时(Runtime)自动编译为本地代码运行效率和代码质量都有很大提高并且保证数据类型安全使用泛型下面是用泛型来重写上面栈用个通用数据类型T来作为个占位符等待在例子化时用个实际类型来代替让我们来看看泛型威力:publicStack<T>{privateTm_item;publicTPop{...}publicvoidPush(Titem){...}publicStack(i){this.m_item=T[i];}}类写法不变只是引入了通用数据类型T就可以适用于任何数据类型并且类型安全这个类思路方法://例子化只能保存类型类Stack<>a=Stack<>(100);a.Push(10);a.Push("8888");//这行编译不通过类a只接收类型数据x=a.Pop;//例子化只能保存类型类Stack<>b=Stack<>(100);b.Push(10);//这行编译不通过类b只接收类型数据b.Push("8888");y=b.Pop;这个类和object实现类有截然区别区别:1.他是类型安全例子化了类型栈就不能处理类型数据其他数据类型也样2.无需装箱和折箱这个类在例子化时按照所传入数据类型生成本地代码本地代码数据类型已确定所以无需装箱和折箱3.无需类型转换泛型类例子化理论C#泛型类在编译时先生成中间代码IL通用类型T只是个占位符在例子化类时根据用户指定数据类型代替T并由即时编译器(JIT)生成本地代码这个本地代码中已