当前位置:编程学习 > C#/ASP.NET >>

C#3.0学习笔记(10)泛型

 

1, 什么是泛型?

       在理解泛型的定义之前,我们要明白非泛型的概念,非泛型就是大部分情况下是声明一个类,然后封装需要的行为,最后创建这些类的实例。

       泛型是一种更准确地使用有一种以上的类型的代码的方式。泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化。总结为一句话就是,泛型类型是类型的模板。

       请仔细理解下面两张图,或许能更好地理解泛型的原理。

      

\

 

\

 

2, 泛型类?

       创建和使用常规的,非泛型的类的过程有两个步骤:声明类和创建类的实例。

       泛型的类不是实际的类,而是类的模板,所以我们必须先从它们构建实际的类类型, 然后个构建后的类类型的实例。

       下图演示了泛型类的创建过程:

  \

 

3, 声明泛型类?

       声明一个泛型类和声明普通类差不多,主要有如下区别:

  1>    在类名之后放置一组尖括号。

  2>    在尖括号中用逗号分隔的占位符字符串来表示希望提供的类型。这叫类型参数(Type Parameter)

  3>    在泛型类声明的主体中使用类型参数来表示应该被替代的类型。

  如下代码所示声明了一个SomeClass的泛型类:

 

www.zzzyk.com

 

 

 class SomeClass<T1, T2> //声明泛型类SomeClass,尖括号中是类型参数。

 

     {

 

        public T1 SomeVar = new T1(); //通常在这些位置使用类型。

 

     }

 

 

     注:泛型和非泛型区分的最主要的标志是:泛型类有尖括号。

 

 

 

4, 创建构造类型?

 

       我们不能直接从泛型类型创建实例对象。首先,我们需要告诉编译器使用哪些真实类型来替代占位符(类型参数)。编译器获取这些真实类型并从它创建一个真实类型对象。

 

       创建构造类型例如:

 

SomeClass<short,int> //尖括号中为类型实参

 

 

5, 创建泛型类的变量和实例?

 

       创建泛型类实例一般有两种方法:

 

       方法一:和普通非泛型类的对象创建方法相似

 

SomeClass<short, int> mySc1 = new SomeClass<short, int>(); //第一种方法创建泛型类实例。

      方法二:使用Var关键字隐式创建:

 

 

 

var mySc2 = new SomeClass<short, int>(); //第二种方法,使用Var关键字创建。

 

 

      例如:

 

         class Program

 

    {

 

        static voidMain(string[] args)

 

        {

 

            var stackInt = new MyStack<int>(); //创建泛型类对象(或称实例),创建构造类型和创建实例可以一步完成。

 

            var stackString=new MyStack<String>();

 

 

 

            stackInt.Push(3); //调用方法

 

            stackInt.Push(5);

 

            stackInt.Push(7);

 

            stackInt.Print();

 

 

 

            stackString.Push("Generics are great!");

 

            stackString.Push("Hi there");

 

            stackString.Print();

 

 

 

            Console.ReadKey();

 

        }

 

    }

 

    class MyStack<T> //声明泛型类

 

    {

 

        T[] StackArray; //声明数组

 

        int StackPointer = 0; //声明并初始化整形变量。

 

        public void Push(T x) //定义无返回值方法

 

        {

 

            if (!IsStackFull)

 

            {

 

                StackArray[StackPointer++] = x; //为数组StackArray赋值。

 

            }

 

        }

 

        public T Pop() //定义有返回值方法

 

        {

 

            return (!IsStackEmpty) //条件运算符,可以用if...else...语句等价表示。

 

                ? StackArray[--StackPointer]

 

                : StackArray[0];

 

        }

 

        public MyStack() //构造函数初始化数组StackArray,为数组分配内存引用。

 

        {

 

            StackArray=new T[MaxStack];

 

        }

 

        public void Print() //构造函数

 

        {

 

            for (int i = StackPointer - 1; i >= 0; i--)

 

            {

 

                Console.WriteLine("Value:{0}",StackArray[i]);

 

            }

 

        }

 

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,