C#2.0 泛型概述
|
1.C# 泛型概述 1.1先看一个通用的结构示例 ·结构类: public class Stack { 软件开发网 www.mscto.com object[] m_Items; public void Push(object item) {……} public object Pop() {……} 软件开发网 www.mscto.com } 实例: Stack stack = new Stack(); 软件开发网 www.mscto.com stack.Push(1); stack.Push(2); int number=(int) stack.Pop();
通用数据结构示例: public class Stack<T> { readonly int m_Size; int m_StackPointer = 0; T[] m_Items; public Stack() : this(100) { 软件开发网 www.mscto.com } public Stack(int size) 软件开发网 www.mscto.com
{ 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() { 软件开发网 www.mscto.com m_StackPointer--; if (m_StackPointer >= 0) { return m_Items[m_StackPointer]; } else { m_StackPointer = 0; //throw new InvalidOperationException("Cannot pop an empty stack"); return default(T); } 软件开发网 www.mscto.com } } 1.2基于Object解决方案存在的问题 (1)性能问题 ·值类型Push时要装箱处理,Pop时要取消装箱处理,造成更多的垃圾碎片,增加垃圾收集的负担。 ·引用类型也有强制转换的开销 (2)类型安全问题(更为严重) ·编译室任何类型都可以转换为Object,无法保证运行时的类型安全 2.什么是泛型 通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率 2.1什么是泛型: ·可以使用任何类型来生明和实例化。 ·声明和实例化是都必须用一个特定的类型来代替一般类型 T 软件开发网 www.mscto.com public class Stack<T> { T[] m_Items; public void Push(T item) { ......} public T Pop() { ......} }
Stack<int> stack = new Stack<int>(); stack.Push(1); stack.Push(2); int number=stack.Pop(); (2)通用数据结构类采用泛型实现 软件开发网 www.mscto.com
public class Stack<T> { readonly int m_Size; int m_StackPointer = 0; T[] m_Items; public Stack() : this(100) { } public Stack(int size) { m_Size = size; 软件开发网 www.mscto.com m_Items = new T[m_Size]; } public void Push(T item) { 软件开发网 www.mscto.com if (m_StackPointer >= m_Size) throw new StackOverflowException();
软件开发网 www.mscto.com m_Items[m_StackPointer] = item; 软件开发网 www.mscto.com
m_StackPointer++; } public T Pop() { m_StackPointer--; if (m_StackPointer >= 0) { 软件开发网 www.mscto.com return m_Items[m_StackPointer]; } 软件开发网 www.mscto.com
else { 软件开发网 www.mscto.com
m_StackPointer = 0; //throw new InvalidOperationException("Cannot pop an empty stack"); return default(T); } } 软件开发网 www.mscto.com } 2.2泛型是如何实现的? ·在.net2.0中,泛型在IL(中间语言)和CRL本身中具有本机支持 ·编译泛型类时,就像编译其他类一样,泛型仅保留一个占位符 ·而用特定类型实例化泛型代码,编译时会将泛型替换为实例化的特定类型 2.3泛型的好处 软件开发网 www.mscto.com ·一次性的开发、测试和部署代码,通过任何类型(包括将来的类型)来重用它 ·编译器支持和类型安全 ·不会强行对值类型进行装箱和取消装箱操作,或者对引用类型进行向下强制类型 转换,所以性能得到显著提高 ---值类型,性能通常会提高200% ---引用类型,在访问该类型时,可以预期性能最多提高100% 2.4应用泛型 ·因为IL和CRL位泛型提供本机支持,所以大多数符合CRL的语言都可以利用一般泛型。 2.5泛型别名 在文件头部使用Using为特定类型取别名 别名的作用范围是整个文件 using List=LinkedList<int ,string>; class ListClient { static void { 软件开发网 www.mscto.com List list=new List(); 软件开发网 www.mscto.com
list.AddHead(123,"AAA"); } }源代码网推荐 源代码网供稿. |
