c#2.0泛型学习(一)

根据微软的视频教程"跟我一起学Visual Studio 2005C#语法篇"来学,因为里面有比较多的代码示例,学起来比较容易好理解

1.未使用泛型的Stack类

 using System;
 
 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");
        }
     }
}

2.使用泛型的类


 using System;
 
 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");
            return default(T);
        }
    }
}

public class Stack1 : Stack
{

}

下为PDF文档,我感觉挺好的,很简单,我听的懂就是好的
/Clingingboy/one.pdf

多个泛型
 class Node
 {
     public K Key;
      public T Item;
     public Node NextNode;
     public Node()
     {
         Key = default(K);
         Item = default(T);
       NextNode = null;
    }
    public Node(K key, T item, Node nextNode)
    {
        Key = key;
        Item = item;
        NextNode = nextNode;
     }
}
反省泛型别名

 LinkedList list = LinkedList;
泛型约束

 public class LinkedList where K : IComparable
 {
      Node m_Head;
     public LinkedList()
     {
          m_Head = new Node();
     }
     public void AddHead(K key, T item)
     {
        Node newNode = new Node(key, item, m_Head.NextNode);
        m_Head.NextNode = newNode;
    }

    T Find(K key)
    {
         Node current = m_Head;
        while (current.NextNode != null)
        {
            if (current.Key.CompareTo(key) == 0)
                break;
            else
                 current = current.NextNode;
        }
        return current.Item;
    }

}

using System;
using System.Collections.Generic;
using System.Text;

namespace VS2005Demo1
{
    public class MyBaseClassGeneric // sealed,static
    {
    }

     interface IMyBaseInterface
    {
        void A();
     }

    internal class GenericClass where T : MyBaseClassGeneric,IMyBaseInterface
    {
    
     }

    class GClass where K : MyBaseClassGeneric,IMyBaseInterface,new() where T : K
    {
     
    }

    class GUClass where T : K where K : MyBaseClassGeneric,IMyBaseInterface, new()
    {
        GClass obj = new GClass();
    }


     不能将引用/值类型约束与基类约束一起使用,因为基类约束涉及到类#region 不能将引用/值类型约束与基类约束一起使用,因为基类约束涉及到类
     
    //class A where T : struct,class
    //{}
     
    #endregion

    不能使用结构和默认构造函数约束,因为默认构造函数约束也涉及到类#region 不能使用结构和默认构造函数约束,因为默认构造函数约束也涉及到类

    //class A where T : struct,new()
    //{}

    #endregion

     虽然您可以使用类和默认构造函数约束,但这样做没有任何价值#region 虽然您可以使用类和默认构造函数约束,但这样做没有任何价值

     class A where T : new()
    {
        T obj = new T();
    }

    class TypeA
    {
        public TypeA() { }
    }

    class TestA
    {
         A obj = new A();
    }

     #endregion

    可以将引用/值类型约束与接口约束组合起来,前提是引用/值类型约束出现在约束列表的开头#region 可以将引用/值类型约束与接口约束组合起来,前提是引用/值类型约束出现在约束列表的开头
    
    class SClass where K : struct, IMyBaseInterface
    { }

     class CClass where K : class, IMyBaseInterface
    { }
     
    #endregion
}

你可能感兴趣的:(c#,class,object,struct,system)