开发手册 欢迎您!
软件开发者资料库

C# - 泛型

C#Generics - 从基本到高级概念的简单简单步骤学习C#,其中包括概述,环境设置,程序结构,基本语法,数据类型,类型转换,变量,常量,运算符,决策,循环,方法,Nullables ,数组,字符串,结构,枚举,文件I / O,类,封装,接口,继承,命名空间,多态性,运算符重载,封装,反射,属性,属性,索引,代理,事件,集合,泛型,匿名方法,不安全代码,预处理器指令,多线程,正则表达式和异常处理。

泛型允许您在类或方法中定义编程元素的数据类型的规范,直到它在程序中实际使用.换句话说,泛型允许您编写可以使用任何数据类型的类或方法.

您可以使用数据类型的替换参数编写类或方法的规范.当编译器遇到类的构造函数或方法的函数调用时,它会生成处理特定数据类型的代码.一个简单的例子将有助于理解概念 :

using System;using System.Collections.Generic;namespace GenericApplication {   public class MyGenericArray {      private T[] array;            public MyGenericArray(int size) {         array = new T[size + 1];      }      public T getItem(int index) {         return array[index];      }      public void setItem(int index, T value) {         array[index] = value;      }   }   class Tester {      static void Main(string[] args) {                  //declaring an int array         MyGenericArray intArray = new MyGenericArray(5);                  //setting values         for (int c = 0; c < 5; c++) {            intArray.setItem(c, c*5);         }                  //retrieving the values         for (int c = 0; c < 5; c++) {            Console.Write(intArray.getItem(c) + " ");         }                  Console.WriteLine();                  //declaring a character array         MyGenericArray charArray = new MyGenericArray(5);                  //setting values         for (int c = 0; c < 5; c++) {            charArray.setItem(c, (char)(c+97));         }                  //retrieving the values         for (int c = 0; c< 5; c++) {            Console.Write(charArray.getItem(c) + " ");         }         Console.WriteLine();                  Console.ReadKey();      }   }}


编译并执行上述代码时,会产生以下结果 :

0 5 10 15 20a b c d e


泛型的特征

泛型是一种通过以下方式丰富您的程序的技术 :

  • 它可以帮助您最大化代码重用,类型安全性和性能.

  • 您可以创建泛型集合类. .NET Framework类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类.您可以使用这些通用集合类而不是 System.Collections 命名空间中的集合类.

  • 您可以创建自己的通用接口,类,方法,事件和委托.

  • 您可以创建约束的泛型类,以便能够访问特定数据类型的方法.

  • 您可以通过反射获得有关通用数据类型在运行时使用的类型的信息.

通用方法

在前面的例子中,我们使用了泛型类;我们可以使用类型参数声明泛型方法.以下程序说明了概念 :

using System;using System.Collections.Generic;namespace GenericMethodAppl {   class Program {      static void Swap(ref T lhs, ref T rhs) {         T temp;         temp = lhs;         lhs = rhs;         rhs = temp;      }      static void Main(string[] args) {         int a, b;         char c, d;         a = 10;         b = 20;         c = 'I';         d = 'V';                  //display values before swap:         Console.WriteLine("Int values before calling swap:");         Console.WriteLine("a = {0}, b = {1}", a, b);         Console.WriteLine("Char values before calling swap:");         Console.WriteLine("c = {0}, d = {1}", c, d);                  //call swap         Swap(ref a, ref b);         Swap(ref c, ref d);                  //display values after swap:         Console.WriteLine("Int values after calling swap:");         Console.WriteLine("a = {0}, b = {1}", a, b);         Console.WriteLine("Char values after calling swap:");         Console.WriteLine("c = {0}, d = {1}", c, d);                  Console.ReadKey();      }   }}


编译并执行上述代码时,会产生以下结果 :

Int values before calling swap:a = 10, b = 20Char values before calling swap:c = I, d = VInt values after calling swap:a = 20, b = 10Char values after calling swap:c = V, d = I


通用代理

您可以使用类型参数定义通用委托.例如 :

delegate T NumberChanger(T n);


以下示例显示了此委托的使用 :

using System;using System.Collections.Generic;delegate T NumberChanger(T n);namespace GenericDelegateAppl {   class TestDelegate {      static int num = 10;            public static int AddNum(int p) {         num += p;         return num;      }      public static int MultNum(int q) {         num *= q;         return num;      }      public static int getNum() {         return num;      }      static void Main(string[] args) {         //create delegate instances         NumberChanger nc1 = new NumberChanger(AddNum);         NumberChanger nc2 = new NumberChanger(MultNum);                  //calling the methods using the delegate objects         nc1(25);         Console.WriteLine("Value of Num: {0}", getNum());                  nc2(5);         Console.WriteLine("Value of Num: {0}", getNum());         Console.ReadKey();      }   }}


编译并执行上述代码时,会产生以下结果 :

Value of Num: 35Value of Num: 175