再次理解泛型

.NET1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持。在机房重构的过程中,我们也都使用了泛型,那时是初次接触,至于详细的真的是不理解?那么泛型是什么,我们先从理解泛型开始。

我们先思考这么一个问题:如果由你来实现一个冒泡排序,如果没有泛型,你会这么写:

<span style="font-family:KaiTi_GB2312;font-size:18px;"> public class SortHelper
    {
        public void BubbleSort( int[] array)
        {
            int length = array.Length;

            for (int i = 0; i <= length - 2; i++)
            {
                for (int j = length - 1; j >= 1; j--)
                {

                    // 对两个元素进行交换
                    if (array[j] < array[j - 1])
                    {
                        int temp = array[j];
                        array[j] = array[j - 1];
                        array[j - 1] = temp;
                    }
                }
            }
        }
</span>

上面的方法体就是一个冒泡排序,咱们重要看的是所传参数类型,接下来

<span style="font-family:KaiTi_GB2312;font-size:18px;">class Program
    {
        static void Main(string[] args)
        {
            SortHelper sorter = new SortHelper();

            int[]  array = { 8, 1, 4, 7, 3 };

            sorter.BubbleSort(array);

            foreach (int i in array)
            {
                Console.Write("{0} ", i);
            }

            Console.WriteLine();
            Console.ReadKey();
        }
    }
</span>

这个程序就可以运行了,结果是一个从小到大的排序。我们发现他运行良好,欣喜地认为这便是解决方案了。但是后来,又需要对一个byte类型的数组进行排序,由于c#是一个强类型的语言,所以最快的办法就是把代码复制一下。那么问题就出来了,如果我再对其他数据类型进行排序呢,总不能一个接着一个复制吧。

这时候,我们就要去想解决方案,我们可以将所传参数看作为一个占位符,由于是一个占位符,因此可以代表任何的类型。我们会发现定义占位符的最好方式就是将int[]、byte[]、char[]用占位符替代掉。占位符用T[]来表示,所以T可以代表任何类型。

而我们需要使用一种特殊的语法来传递这个T占位符,.NET提供了专门的语法来传递占位符,其中一种就是在定义类型的时候传递,此时类型也就变成了泛型类。

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class SortHelper<T>{
	public void BubbleSort(T[] array){
	//方法实现体
 	}
}</span>

当需要为一个int类型的数组排序时:

<span style="font-family:KaiTi_GB2312;font-size:18px;">SortHelper<int> sorter=new SorterHelper<int>();
int[] array ={8.1.4.7.3};
sorter.BubbleSort(array);
</span>

可以看到,通过使用泛型,极大地减少了重复代码,使程序更加清爽,泛型类就类似于一个模板,可以在需要时为这个模板传入任何需要的类型。同样,我们平常所见到的泛型是和其他知识混合一起出现的,像泛型集合,反射泛型,委托泛型。我们要做的是逐个破解。

时间: 2024-11-01 20:58:48

再次理解泛型的相关文章

理解泛型

1.1 理解泛型1.1.1 为什么要有泛型? 我想不论大家通过什么方式进入了计算机程序设计这个行业,都免不了 要面对数据结构和算法这个话题.因为它是计算机科学的一门基础学科 ,往往越是底层的部分,对于数据结构或者算法的时间效率和空间效率 的要求就越高.比如说,当你在一个集合类型(例如ArrayList)的实例 上调用Sort()方法对它进行排序时,.Net框架在底层就应用了快速排序 算法..Net框架中快速排序方法名称叫QuickSort(),它位于Array类型 中,这可以通过Reflecto

C#理解泛型

C# 理解泛型 出处:http://www.ondotnet.com/pub/a/dotnet/2004/05/17/liberty.html 术语表 generics:泛型 type-safe:类型安全 collection: 集合 compiler:编译器 run time:程序运行时 object: 对象 .NET library:.Net类库 value type: 值类型 box: 装箱 unbox: 拆箱 implicity: 隐式 explicity: 显式 linked list

再次理解WCF以及其通信(附加一個編程小經驗)

一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterprise Services的功能并集成在Visual Studio中. WCF

(转)java.ByteArrayInputStream与ByteArrayOutputStream再次理解

转载自:java.ByteArrayInputStream与ByteArrayOutputStream再次理解 第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutputStream的用法 以下是JDK中的记载: public class ByteArrayOutputStream  extends OutputStream 此类实现了一个输出流,其中

再次理解HTTP请求过程

我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次!程序只管处理一次即可! HTTP请求 步骤1:浏览器首先向服务器发送HTTP请求,请求包括: 方法:GET还是POST,GET仅请求资源,POST会附带用户数据: 路径:/html/path: 域名:由Host头指定:Host: www.sina.com.cn 以及其他相关的Header: 如果是

ON_MESSAGE和ON_NOTITY再次理解

ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏 对这几个消息的理解要先了解一下Window消息的背景. 在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中.由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时

二分算法 再次理解

二分算法 再次理解 详解二分查找算法 这篇博客很详细介绍了二分算法的一些细节问题 寻找一个数,也是最基本的二分搜索 //代码示例如下 int bsearch(int []nums, int target) { int left=0, right=nums.length-1;//这里的数组长度用法可以是其他的形式 while(left<=right) { int mid = left + (right - left) / 2; if(num[mid] == target) return mid;

最佳新秀Java(22)——再次了解泛型

仿制药Java SE 1.5新功能.通用自然是参数化类型.即操作数据类型被指定为一个参数.这样的参数类型可以在课堂上使用.创建的接口和方法,他们被称为通用类..泛型方法. Java语言引入泛型的优点是安全简单. 规则和限制 1.泛型的类型參数仅仅能是类类型(包含自己定义类),不能是简单类型.2.同一种泛型能够相应多个版本号(由于參数类型是不确定的),不同版本号的泛型类实例是不兼容的.3.泛型的类型參数能够有多个.4.泛型的參数类型能够使用extends语句.比如<T extends superc

Android开发之深入理解泛型extends和super的区别

摘要: 什么是泛型?什么是擦除边界?什么是上界限定或下界限定(子类型限定或超类型限定)?什么是类型安全?泛型extends关和super关键字结合通配符?使用的区别,两种泛型在实际Android开发中有什么用处? 一.什么是泛型? 泛型,大概的意思是指没有指定具体的类型的类或方法,以泛型的形式传入一个类中或方法中,在Java编程(Android编程)里面使用一对尖括号和一个大写字母表示,例如: //泛型类 public interface List<E>{} //泛型方法,类型参数位于返回类型