课程表

C# 基础教程

C# 高级教程

C# 工具/手册

工具箱
速查手册

C# 泛型(Generic)

当前位置:免费教程 » 程序设计 » C#

泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

您可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。下面这个简单的实例将有助于您理解这个概念:

  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace GenericApplication
  5. {
  6. public class MyGenericArray<T>
  7. {
  8. private T[] array;
  9. public MyGenericArray(int size)
  10. {
  11. array = new T[size + 1];
  12. }
  13. public T getItem(int index)
  14. {
  15. return array[index];
  16. }
  17. public void setItem(int index, T value)
  18. {
  19. array[index] = value;
  20. }
  21. }
  22. class Tester
  23. {
  24. static void Main(string[] args)
  25. {
  26. // 声明一个整型数组
  27. MyGenericArray<int> intArray = new MyGenericArray<int>(5);
  28. // 设置值
  29. for (int c = 0; c < 5; c++)
  30. {
  31. intArray.setItem(c, c*5);
  32. }
  33. // 获取值
  34. for (int c = 0; c < 5; c++)
  35. {
  36. Console.Write(intArray.getItem(c) + " ");
  37. }
  38. Console.WriteLine();
  39. // 声明一个字符数组
  40. MyGenericArray<char> charArray = new MyGenericArray<char>(5);
  41. // 设置值
  42. for (int c = 0; c < 5; c++)
  43. {
  44. charArray.setItem(c, (char)(c+97));
  45. }
  46. // 获取值
  47. for (int c = 0; c < 5; c++)
  48. {
  49. Console.Write(charArray.getItem(c) + " ");
  50. }
  51. Console.WriteLine();
  52. Console.ReadKey();
  53. }
  54. }
  55. }

我来试一下

当上面的代码被编译和执行时,它会产生下列结果:

0 5 10 15 20
a b c d e

泛型(Generic)的特性

使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:

  • 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
  • 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
  • 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
  • 您可以对泛型类进行约束以访问特定数据类型的方法。
  • 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

泛型(Generic)方法

在上面的实例中,我们已经使用了泛型类,我们可以通过类型参数声明泛型方法。下面的程序说明了这个概念:

  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace GenericMethodAppl
  5. {
  6. class Program
  7. {
  8. static void Swap<T>(ref T lhs, ref T rhs)
  9. {
  10. T temp;
  11. temp = lhs;
  12. lhs = rhs;
  13. rhs = temp;
  14. }
  15. static void Main(string[] args)
  16. {
  17. int a, b;
  18. char c, d;
  19. a = 10;
  20. b = 20;
  21. c = 'I';
  22. d = 'V';
  23.  
  24. // 在交换之前显示值
  25. Console.WriteLine("Int values before calling swap:");
  26. Console.WriteLine("a = {0}, b = {1}", a, b);
  27. Console.WriteLine("Char values before calling swap:");
  28. Console.WriteLine("c = {0}, d = {1}", c, d);
  29.  
  30. // 调用 swap
  31. Swap<int>(ref a, ref b);
  32. Swap<char>(ref c, ref d);
  33.  
  34. // 在交换之后显示值
  35. Console.WriteLine("Int values after calling swap:");
  36. Console.WriteLine("a = {0}, b = {1}", a, b);
  37. Console.WriteLine("Char values after calling swap:");
  38. Console.WriteLine("c = {0}, d = {1}", c, d);
  39. Console.ReadKey();
  40. }
  41. }
  42. }

我来试一下

当上面的代码被编译和执行时,它会产生下列结果:

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

泛型(Generic)委托

您可以通过类型参数定义泛型委托。例如:

  1. delegate T NumberChanger<T>(T n);

下面的实例演示了委托的使用:

  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. delegate T NumberChanger<T>(T n);
  5. namespace GenericDelegateAppl
  6. {
  7. class TestDelegate
  8. {
  9. static int num = 10;
  10. public static int AddNum(int p)
  11. {
  12. num += p;
  13. return num;
  14. }
  15.  
  16. public static int MultNum(int q)
  17. {
  18. num *= q;
  19. return num;
  20. }
  21. public static int getNum()
  22. {
  23. return num;
  24. }
  25.  
  26. static void Main(string[] args)
  27. {
  28. // 创建委托实例
  29. NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
  30. NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
  31. // 使用委托对象调用方法
  32. nc1(25);
  33. Console.WriteLine("Value of Num: {0}", getNum());
  34. nc2(5);
  35. Console.WriteLine("Value of Num: {0}", getNum());
  36. Console.ReadKey();
  37. }
  38. }
  39. }

我来试一下

当上面的代码被编译和执行时,它会产生下列结果:

Value of Num: 35
Value of Num: 175
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号