1,什么是泛型?
答:泛型是类型的模板,类型是实例(对象)的模板。C#提供了5种泛型:类,接口,委托,结构和方法。
2,使用泛型有什么好处?
答:继承实现的是"代码重用",而泛型实现的是另一种形式的代码重用,即"算法重用"。总结起来有以下优点:
1> 提高代码的可重用性。
2> 编译时的类型安全性。当使用一个不兼容的类型的时候,会在编译时就报错,而不用等到运行时再报错,提高了类型安全性。
3> 更佳的性能。当操作值类型实例的时候,使用泛型会减少值类型的装箱,这样在程序的托管堆上内存分配更少,垃圾回收也没那么频繁,从而能提高程序的性能。
使用泛型类实例
下面是一个使用泛型来实现栈的实例,Main方法定义了两个变量,stackInt和stackString。使用int和string作为类型实参来创建这两个构造类型的实例(对象)。代码如下:
1 namespace GenericDemo1 2 { 3 //定义一个泛型类 4 class MyStack<T> 5 { 6 T[] StackArray;//声明数组引用 7 int StackPointer = 0; 8 9 const int MaxStack = 10; 10 bool IsStackFull//只读属性 11 { 12 get 13 { 14 return StackPointer >= MaxStack; 15 } 16 } 17 bool IsStackEmpty 18 { 19 get 20 { 21 return StackPointer <= 0; 22 } 23 } 24 25 public void Push(T x)//入栈 26 { 27 if (!IsStackFull)//栈未满 28 { 29 StackArray[StackPointer++] = x; 30 } 31 } 32 33 public T Pop()//出栈 34 { 35 return (!IsStackEmpty)?StackArray[--StackPointer]:StackArray[0]; 36 } 37 38 public MyStack()//构造函数 39 { 40 StackArray=new T[MaxStack];//实例化数组对象 41 } 42 43 public void Print() 44 { 45 for (int i = StackPointer - 1; i >= 0; i--) 46 { 47 Console.WriteLine("Value: {0}",StackArray[i]); 48 } 49 } 50 } 51 52 class Program 53 { 54 static void Main(string[] args) 55 { 56 var stackInt = new MyStack<int>();//实例化构造类型,等价于MyStack<int> stackInt=new MyStack<int>(); 57 var stackString = new MyStack<string>(); 58 59 stackInt.Push(3);//调用Push方法,注意此时类型实参为int 60 stackInt.Push(5); 61 stackInt.Push(7); 62 stackInt.Print(); 63 64 stackString.Push("A");//调用Push方法,注意此时类型实参为string 65 stackString.Push("B"); 66 stackString.Print(); 67 68 Console.ReadKey(); 69 70 } 71 } 72 }
程序输出结果为: