C# 泛型(Generic)

小咪咪 2024-03-22 23:27 262阅读 0赞

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

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

实例

  1. using
  2. System
  3. ;
  4. using
  5. System.Collections.Generic
  6. ;
  7. namespace GenericApplication
  8. {
  9. public
  10. class MyGenericArray
  11. <T
  12. >
  13. {
  14. private T
  15. [
  16. ] array
  17. ;
  18. public MyGenericArray
  19. (
  20. int size
  21. )
  22. {
  23. array
  24. =
  25. new T
  26. [size
  27. +
  28. 1
  29. ]
  30. ;
  31. }
  32. public T getItem
  33. (
  34. int index
  35. )
  36. {
  37. return array
  38. [index
  39. ]
  40. ;
  41. }
  42. public
  43. void setItem
  44. (
  45. int index, T
  46. value
  47. )
  48. {
  49. array
  50. [index
  51. ]
  52. =
  53. value
  54. ;
  55. }
  56. }
  57. class Tester
  58. {
  59. static
  60. void Main
  61. (
  62. string
  63. [
  64. ] args
  65. )
  66. {
  67. // 声明一个整型数组
  68. MyGenericArray
  69. <
  70. int
  71. > intArray
  72. =
  73. new MyGenericArray
  74. <
  75. int
  76. >
  77. (
  78. 5
  79. )
  80. ;
  81. // 设置值
  82. for
  83. (
  84. int c
  85. =
  86. 0
  87. ; c
  88. <
  89. 5
  90. ; c
  91. ++
  92. )
  93. {
  94. intArray
  95. .
  96. setItem
  97. (c, c
  98. *
  99. 5
  100. )
  101. ;
  102. }
  103. // 获取值
  104. for
  105. (
  106. int c
  107. =
  108. 0
  109. ; c
  110. <
  111. 5
  112. ; c
  113. ++
  114. )
  115. {
  116. Console
  117. .
  118. Write
  119. (intArray
  120. .
  121. getItem
  122. (c
  123. )
  124. +
  125. " "
  126. )
  127. ;
  128. }
  129. Console
  130. .
  131. WriteLine
  132. (
  133. )
  134. ;
  135. // 声明一个字符数组
  136. MyGenericArray
  137. <
  138. char
  139. > charArray
  140. =
  141. new MyGenericArray
  142. <
  143. char
  144. >
  145. (
  146. 5
  147. )
  148. ;
  149. // 设置值
  150. for
  151. (
  152. int c
  153. =
  154. 0
  155. ; c
  156. <
  157. 5
  158. ; c
  159. ++
  160. )
  161. {
  162. charArray
  163. .
  164. setItem
  165. (c,
  166. (
  167. char
  168. )
  169. (c
  170. +
  171. 97
  172. )
  173. )
  174. ;
  175. }
  176. // 获取值
  177. for
  178. (
  179. int c
  180. =
  181. 0
  182. ; c
  183. <
  184. 5
  185. ; c
  186. ++
  187. )
  188. {
  189. Console
  190. .
  191. Write
  192. (charArray
  193. .
  194. getItem
  195. (c
  196. )
  197. +
  198. " "
  199. )
  200. ;
  201. }
  202. Console
  203. .
  204. WriteLine
  205. (
  206. )
  207. ;
  208. Console
  209. .
  210. ReadKey
  211. (
  212. )
  213. ;
  214. }
  215. }
  216. }

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

  1. 0 5 10 15 20
  2. a b c d e

泛型(Generic)的特性

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

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

泛型(Generic)方法

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

实例

  1. using
  2. System
  3. ;
  4. using
  5. System.Collections.Generic
  6. ;
  7. namespace GenericMethodAppl
  8. {
  9. class Program
  10. {
  11. static
  12. void Swap
  13. <T
  14. >
  15. (
  16. ref T lhs,
  17. ref T rhs
  18. )
  19. {
  20. T temp
  21. ;
  22. temp
  23. = lhs
  24. ;
  25. lhs
  26. = rhs
  27. ;
  28. rhs
  29. = temp
  30. ;
  31. }
  32. static
  33. void Main
  34. (
  35. string
  36. [
  37. ] args
  38. )
  39. {
  40. int a, b
  41. ;
  42. char c, d
  43. ;
  44. a
  45. =
  46. 10
  47. ;
  48. b
  49. =
  50. 20
  51. ;
  52. c
  53. =
  54. 'I'
  55. ;
  56. d
  57. =
  58. 'V'
  59. ;
  60. // 在交换之前显示值
  61. Console
  62. .
  63. WriteLine
  64. (
  65. "Int values before calling swap:"
  66. )
  67. ;
  68. Console
  69. .
  70. WriteLine
  71. (
  72. "a = {0}, b = {1}", a, b
  73. )
  74. ;
  75. Console
  76. .
  77. WriteLine
  78. (
  79. "Char values before calling swap:"
  80. )
  81. ;
  82. Console
  83. .
  84. WriteLine
  85. (
  86. "c = {0}, d = {1}", c, d
  87. )
  88. ;
  89. // 调用 swap
  90. Swap
  91. <
  92. int
  93. >
  94. (
  95. ref a,
  96. ref b
  97. )
  98. ;
  99. Swap
  100. <
  101. char
  102. >
  103. (
  104. ref c,
  105. ref d
  106. )
  107. ;
  108. // 在交换之后显示值
  109. Console
  110. .
  111. WriteLine
  112. (
  113. "Int values after calling swap:"
  114. )
  115. ;
  116. Console
  117. .
  118. WriteLine
  119. (
  120. "a = {0}, b = {1}", a, b
  121. )
  122. ;
  123. Console
  124. .
  125. WriteLine
  126. (
  127. "Char values after calling swap:"
  128. )
  129. ;
  130. Console
  131. .
  132. WriteLine
  133. (
  134. "c = {0}, d = {1}", c, d
  135. )
  136. ;
  137. Console
  138. .
  139. ReadKey
  140. (
  141. )
  142. ;
  143. }
  144. }
  145. }

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

  1. Int values before calling swap:
  2. a = 10, b = 20
  3. Char values before calling swap:
  4. c = I, d = V
  5. Int values after calling swap:
  6. a = 20, b = 10
  7. Char values after calling swap:
  8. c = V, d = I

泛型(Generic)委托

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

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

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

实例

  1. using
  2. System
  3. ;
  4. using
  5. System.Collections.Generic
  6. ;
  7. delegate T NumberChanger
  8. <T
  9. >
  10. (T n
  11. )
  12. ;
  13. namespace GenericDelegateAppl
  14. {
  15. class TestDelegate
  16. {
  17. static
  18. int num
  19. =
  20. 10
  21. ;
  22. public
  23. static
  24. int AddNum
  25. (
  26. int p
  27. )
  28. {
  29. num
  30. += p
  31. ;
  32. return num
  33. ;
  34. }
  35. public
  36. static
  37. int MultNum
  38. (
  39. int q
  40. )
  41. {
  42. num
  43. *= q
  44. ;
  45. return num
  46. ;
  47. }
  48. public
  49. static
  50. int getNum
  51. (
  52. )
  53. {
  54. return num
  55. ;
  56. }
  57. static
  58. void Main
  59. (
  60. string
  61. [
  62. ] args
  63. )
  64. {
  65. // 创建委托实例
  66. NumberChanger
  67. <
  68. int
  69. > nc1
  70. =
  71. new NumberChanger
  72. <
  73. int
  74. >
  75. (AddNum
  76. )
  77. ;
  78. NumberChanger
  79. <
  80. int
  81. > nc2
  82. =
  83. new NumberChanger
  84. <
  85. int
  86. >
  87. (MultNum
  88. )
  89. ;
  90. // 使用委托对象调用方法
  91. nc1
  92. (
  93. 25
  94. )
  95. ;
  96. Console
  97. .
  98. WriteLine
  99. (
  100. "Value of Num: {0}", getNum
  101. (
  102. )
  103. )
  104. ;
  105. nc2
  106. (
  107. 5
  108. )
  109. ;
  110. Console
  111. .
  112. WriteLine
  113. (
  114. "Value of Num: {0}", getNum
  115. (
  116. )
  117. )
  118. ;
  119. Console
  120. .
  121. ReadKey
  122. (
  123. )
  124. ;
  125. }
  126. }
  127. }

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

  1. Value of Num: 35
  2. Value of Num: 175

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C# Generic

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

    相关 (Generic) 的优点

    泛型引入前编程的痛点 `JDK 1.5` 版本以前没有泛型,使用 Object 来实现不同类型的处理,有两个缺点 1、每次使用时都需要`强制转换`; 2、在`编译

    相关 【Reflect】(generics)

    Java泛型概述     泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、接口和方法的创