泛型的使用

泛型概述

泛型是用于处理算法、数据结构的一种编程方法。泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构,以使它们能够直接用于软件构造。泛型类、结构、接口、委托和方法可以根据它们存储和操作的数据类型来进行参数化。泛型可在编译时提供强大的类型检查,减少数据类型之间的显式转换、装箱操作和运行时的类型检查等。泛型类和泛型方法同时具备可重用性、类型安全和效率高等特性,这是非泛型类和非泛型方法所无法具备的。

? 技巧:泛型通常用在集合和在集合上运行的方法中。

类型参数T

泛型的类型参数T可以看作是一个占位符,它不是一种类型,而仅代表某种可能的类型。在定义泛型时,T出现的位置可以在使用时用任何类型来代替。类型参数T的命名规则如下:

使用描述性名称命名泛型类型参数,除非单个字母名称完全可以让人了解它表示的含义,而描述性名称不会有更多的意义。

例 使用代表一定意义的单词作为类型参数T的名称,代码如下。

public interface ISessionChannel<Session>

public delegate TOutput Converter<Input, Output>

将T作为描述性类型参数名的前缀。

例 使用“T”作为类型参数名的前缀,代码如下。

public interface ISessionChannel<TSession>

{

    TSession Session { get; }

}

泛型接口的声明及使用

泛型接口的声明形式如下:

interface 【接口名】<T>

{

【接口体】

}

声明泛型接口时,与声明一般接口的唯一区别是增加了一个<T>。一般来说,声明泛型接口与声明非泛型接口遵循相同的规则。泛型类型声明所实现的接口必须对所有可能的构造类型都保持唯一,否则无法确定该为某些构造类型调用哪个方法。

例 创建一个控制台应用程序。首先创建一个Factory类,在此类中建立一个CreateInstance方法;然后再创建一个泛型接口,在这个泛型接口中调用CreateInstance方法;根据类型参数T,获取其类型。代码如下:(实例位置:光盘\TM\第17章\例17.6)

//创建一个泛型接口

public interface IGenericInterface<T>

{

    T CreateInstance();                                                                           //接口中调用CreateInstance方法

}

//实现上面泛型接口的泛型类

//派生约束where T : TI(T要继承自TI)

//构造函数约束where T : new()(T可以实例化)

public class Factory<T, TI> : IGenericInterface<TI> where T : TI, new()

{

    public TI CreateInstance()                                                               //创建一个公共方法CreateInstance

    {

        return new T();

    }

}

class Program

{

    static void Main(string[] args)

    {

        //实例化接口

        IGenericInterface<System.ComponentModel.IListSource> factory =new Factory<System.Data.DataTable, System.ComponentModel.IListSource>();

    //输出指定泛型的类型

        Console.WriteLine(factory.CreateInstance().GetType().ToString());

        Console.ReadLine();

    }

}

 

泛型方法的声明及使用

泛型方法的声明形式如下:

【修饰符】 void 【方法名】<类型型参T>

{

【方法体】

}

泛型方法是在声明中包括了类型参数T的方法。泛型方法可以在类、结构或接口声明中声明,这些类、结构或接口本身可以是泛型或非泛型。如果在泛型类型声明中声明泛型方法,则方法体可以同时引用该方法的类型参数T和包含该方法声明的类型参数T。

例 创建一个控制台应用程序,通过定义一个泛型方法,查找数组中某个数字的位置。代码如下:

public class Finder                                                                                             //建立一个公共类Finder

{

    public static int Find<T>(T[] items, T item)                                        //创建泛型方法

    {

        for (int i = 0; i < items.Length; i++)                                                 //调用for循环

        {

            if (items[i].Equals(item))                                                        //调用Equals方法比较两个数

            {

                return i;                                                                              //返回相等数在数组中的位置

            }

        }

        return -1;                                                                                            //如果不存在指定的数,则返回-1

    }

}

class Program

{

    static void Main(string[] args)

    {

        int i = Finder.Find<int>(new int[] { 1, 2, 3, 4, 5, 6, 8, 9 }, 6);      //调用泛型方法,并定义数组中指定数字

        Console.WriteLine("6在数组中的位置:" + i.ToString());           //输出数字6在数组中的位置

        Console.ReadLine();

    }

}

 

 

使用泛型去掉数组中的重复数字

 

使用泛型去掉数组中的重复数字时,首先需要对数组进行排序,排序之后重复的数字肯定是相邻的,这时只需比较邻近的数字是否相同即可。在下面的实例中将使用泛型去掉数组中的重复数字。

例17.9  使用泛型去掉数组中的重复数字,程序开发步骤如下。(实例位置:光盘\TM\第17章\例17.9)

(1)新建一个控制台应用程序,命名为RemoveXTNum。在该程序中首先自定义一个静态的返回值类型为int数组的RemoveNum方法,用来去掉数组中的重复数字。该方法中有一个int数组类型的参数,用来表示要去掉重复数字的数组。RemoveNum方法实现代码如下:

#region 去掉数组中的重复数字

/// <summary>

/// 去掉数组中的重复数字

/// </summary>

/// <param>要去除重复数字的int数组</param>

/// <returns>取出重复数字之后的数组</returns>

static int[] RemoveNum(int[] data)

{

    List<int> lists = new List<int>();                                       //实例化泛型集合

    for (int i = 0; i < data.Length-1; i++)                             //循环访问源数组元素

    {

        if (data[i] != data[i + 1])                                               //判断相邻的值是否相同

        {

            lists.Add(data[i]);                                                 //如果不同,将值添加到泛型集合中

        }

    }

    lists.Add(data[data.Length - 1]);                                            //将数组的最后一个元素添加到泛型集合中

    return lists.ToArray();                                                            //将泛型集合转换为数组,并返回

}

#endregion

(2)在Main方法中,首先定义一个int类型的一维数组,然后使用冒泡排序算法对其进行排序,最后调用自定义方法RemoveNum对排序后的数组进行操作,去掉其重复数字并输出。实现代码如下:

static void Main(string[] args)

{

    int[] arr = new int[] { 3, 9, 15, 6, 18, 6, 21, 15 };                   //定义一个一维数组,并赋值

    Console.Write("初始数组:");

    foreach (int m in arr)                                                               //循环遍历定义的一维数组,并输出其中的元素

        Console.Write(m + " ");

    Console.WriteLine();

    //定义两个int类型的变量,分别用来表示数组下标和存储新的数组元素

    int j, temp;

    for (int i = 0; i < arr.Length - 1; i++)                             //根据数组下标的值遍历数组元素

    {

        j = i + 1;

    id:                                                                                            //定义一个标识,以便从这里开始执行语句

        if (arr[i] > arr[j])                                                          //判断前后两个数的大小

        {

            temp = arr[i];                                                        //将比较后大的元素赋值给定义的int变量

            arr[i] = arr[j];                                                        //将后一个元素的值赋值给前一个元素

            arr[j] = temp;                                                        //将int变量中存储的元素值赋值给后一个元素

            goto id;                                                                   //返回标识,继续判断后面的元素

        }

        else

            if (j < arr.Length - 1)                                            //判断是否执行到最后一个元素

            {

                j++;                                                                //如果没有,则再往后判断

                goto id;                                                           //返回标识,继续判断后面的元素

            }

    }

    Console.Write("排序后的数组:");

    foreach (int n in arr)                                                                //循环遍历排序后的数组元素并输出

        Console.Write(n + " ");

    int[] newArr = RemoveNum(arr);                                        //去掉重复数字

    Console.WriteLine();

    Console.Write("去掉重复数字之后的数组:");

    foreach (int n in newArr)                                                        //循环遍历排序后的数组元素并输出

        Console.Write(n + " ");

    Console.ReadLine();

}

按Ctrl+F5键查看运行结果,如图所示。

 

图  使用泛型去掉数组中的重复数字

posted on 2010-04-29 12:20  胜锐  阅读(518)  评论(0编辑  收藏  举报