pursuedream
成功=水平+业务+沟通+判断
泛型:说白了就是使用同一段代码满足不同类型的使用,达到代码复用,而又不影响性能。
   在VS2003中,通常做法是使用OBJECT类型来满足,但这样造成要进行封箱和拆箱,影响性能。
//创建堆栈。
//堆栈是分配连续存储空间,栈是系统管理的,堆是程序自身管理的。
//堆是动态分配的。在程序执行期间要注意管理。
//栈是系统为你的程序分配的,你申请的非动态变量函数调用的出入口都在里面
public class Stack
{
   
readonly int m_Size; 
   
int m_StackPointer = 0;
   
object[] m_Items; 
   
public Stack():this(100)
   {}   
   
public Stack(int size)
   {
      m_Size 
= size;
      m_Items 
= new object[m_Size];
   }
   
public void Push(object item)
   {
      
if(m_StackPointer >= m_Size) 
         
throw new StackOverflowException();       
      m_Items[m_StackPointer] 
= item;
      m_StackPointer
++;
   }
   
public object Pop()
   {
      m_StackPointer
--;
      
if(m_StackPointer >= 0)
      {
         
return m_Items[m_StackPointer];
      }
      
else
      {
         m_StackPointer 
= 0;
         
throw new InvalidOperationException("Cannot pop an empty stack");
      }
   }
}
运用:这样会抛出异常
Stack stack = new Stack();
stack.Push(
1);
//This compiles, but is not type safe, and will throw an exception: 
string number = (string)stack.Pop();
泛型使用
//Object用T[]替换
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;
      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");
      }
   }
}
可以使用default() 运算符,它返回类型的默认值。 return default(T);
实例化该类 Stack<int> s=new Stack<int>(100); //其中〈int〉可以换成其他类型或
Stack<string> s=new Stack<string>(100);
 泛型类实例化的理论  
C#泛型类在编译时,先生成中间代码IL,通用类型T只是一个占位符。在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类,所以不同的封闭类的本地代码是不一样的.那么Stack<int>和Stack〈string〉是两个不同的类。

posted on 2007-01-25 12:22  pursuedream  阅读(227)  评论(0)    收藏  举报