说说

前期看了很多大佬们的博客,在机房重构的时候都用到了泛型,站在巨人的肩膀上,也来小学一下。

了解

之前我们在看C#视频的时候,大家应该清楚集合的概念,集合有很多种(Array List、List、dictionary、哈希表等),泛型就是其中一种,具体各种集合的概念与用法就不多说了,不了解的可以看这篇博客【c#】之集合

泛型可以说是程序设计语言的一种特性。百度上这样说“允许程序员在强类型程序设计语言中编写代码时,定义一些可变部分,那些部分在使用前必须做出指明。各种程序设计语言和其编译器、运行环境对泛型的指出均不一样。将类型参数化以达到代码复用提高软件开发工作i效率的一种数据类型,是堆对象,主要引入了类型参数这个概念” 念完之后还是不是很懂,哈哈哈。

简单粗暴一点说“我们在编程时,难免会写很多有返回值或传入值的调用方法,但是如果我们需要返回多个数据类型或传入多种数据类型实现同一个方法体,那么如果每个数据类型都定义一种方法的话,就会很费事,如果用泛型来解决,就容易了很多,减少了代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱、拆箱,在一定程度上提升了程序的性能。

普及拆装箱:

  • 拆箱:引用类型——》值类型(如 int—— )
  • 装箱:值类型——》引用类型(如 ——int)

举个栗子

我们都学过了数据结构和算法,对于我们编程人员来说,越底层的部分对数据结构或者算法的时间效率和空间效率要求越高,我们就拿一个简单的冒泡排序算法来举例:

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;    
                }
            }
        }
    }
}

下面是对上面方法的调用

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();
    }
}

输出

1 3 4 7 8

这段代码我们在学习数据结构时就已经掌握了,但是如果现在我们提出要求,在添加一个对byte类型的数组进行冒泡排序,你会怎么办? 答:简单粗暴的复制粘贴,然后更改代码的签名吗?,那如果又提出对char类型的一组数据进行冒泡排序呢?

我们可以对比一下这三个方法的签名:

//因为这三个类型是完全兼容的,所以方法体可以一样
//但是C#是一个强类型的语言,我们无法在一个接受int数组类型的地方传入一个byte数组,所以方法签名需要更改。
public void BubbleSort(int[] array)
public void BubbleSort(byte[] array)
public void BubbleSort(char[] array)

我们可以看到,这三个除了签名不一样,其余都是一样的,这样的话,我们是不是能够定义一个占位符,将这三个签名替换掉,好,那么我们就用T[]占位符来表示,其中T可以代替任何类型:

public void BubbleSort(T[] 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]) {
                T temp = array[j];
                array[j] = array[j - 1];
                array[j - 1] = temp;
            }
        }
    }
}

但是问题又来了,我们知道,当我们定义一个类的时候,传进这个类中的参数可以时某个具体的类型实例名称,
待续。。。

收藏 打印