C# 泛型是一种类型占位符,或称之为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显好处是——类型安全和减少装箱、拆箱。通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。您只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。为此,需要使用 ﹤ 和 ﹥ 括号,以便将一般类型参数括起来。例如,可以按如下方式定义和使用一般堆栈:
- public class Stack
- {
- T[] m_Items;
- public void Push(T item)
- {...}
- public T Pop()
- {...}
- }
- Stack stack = new Stack();
- stack.Push(1);
- stack.Push(2);
- int number = stack.Pop();
C# 泛型代码块
显示一般堆栈的完整实现。将代码块 1 与代码块 2 进行比较,您会看到,好像 代码块 1 中每个使用 Object 的地方在代码块 2 中都被替换成了 T,除了使用一般类型参数 T 定义 Stack 以外:
- public class Stack
- {...}
在使用一般堆栈时,必须通知编译器使用哪个类型来代替一般类型参数 T(无论是在声明变量时,还是在实例化变量时):
- Stack stack = new Stack();
编译器和运行库负责完成其余工作。所有接受或返回 T 的方法(或属性)都将改为使用指定的类型(在上述示例中为整型)。
C# 泛型代码块之一般堆栈
- public class Stack
- {
- readonly int m_Size;
- int m_StackPointer = 0;
- T[] m_Items;
- public Stack():this(100)
- {}
- public Stack(int size)
- {
- m_Size = size;
- m_Items = new T[m_Size];
- }
- public void Push(T item)
- {
- if(m_StackPointer ﹥= m_Size)
- throw new StackOverflowException();
- m_Items[m_StackPointer] = item;
- m_StackPointer++;
- }
- public T Pop()
- {
- m_StackPointer--;
- if(m_StackPointer ﹥= 0)
- {
- return m_Items[m_StackPointer];
- }
- else
- {
- m_StackPointer = 0;
- throw new InvalidOperationException(
- "Cannot pop an empty stack");
- }
- }
- }
注 T 是一般类型参数(或类型参数),而一般类型为 Stack。Stack 中的 int 为类型实参。
该编程模型的优点在于,内部算法和数据操作保持不变,而实际数据类型可以基于客户端使用服务器代码的方式进行更改。
C# 泛型的基本概念就向你介绍到这里,希望对你了解和学习C# 泛型有所帮助。
【编辑推荐】