C# 泛型學習總結


參考:http://www.cnblogs.com/jimmyzhang/archive/2007/08/04/842663.html

  對泛型的理解進行梳理,學習博客園大師的文章,並將之變成自己的東西,再加之自己的理解想陳述的更加簡單直觀些,能力有限,且文筆功底略顯不足,因此如有欠妥之處請不吝賜教。——寫在前面

泛型如何理解?

1.實現代碼復用,無須對不同類型編寫近乎相同的代碼(僅僅參數類型不同)。而實際上Console.Write()方法也並未采用泛型,因此出現下圖若干重載函數,至於為什么未采用泛型在此不做研究。

2.使用了泛型的集合可以保證其類型安全以及可以避免集合添加元素、取出元素時候的裝箱、拆箱操作。

一個簡單的例子

   初學泛型曾看了一些文章,好像大都直接拿泛型集合說事,本人比較不夠聰明,總以為泛型僅僅用於泛型集合的,以至於很長時間以來一想到泛型就想到泛型集合。如果有園友初學泛型,那么暫且不要關心泛型集合,只關心泛型,且看如下例子。

    我們需要將兩個值ToString()后再相加並輸出到屏幕,那么我們可能會像如下這么寫(可能這么簡單的功能沒人會像如下這么做,大概會只封裝一個以string為參數的函數,在傳參的時候ToString(),此處只是為了舉例的方便,假設函數沒那么簡單的情況下):

    class MyHelper
    {
        public static void AddAndPrint(int i, int j)
        {
            Console.WriteLine(string.Format("The value is {0}", i.ToString() + "@" + j.ToString()));
        }
        public static void AddAndPrint(float i, float j)
        {
            Console.WriteLine(string.Format("The value is {0}", i.ToString() + "@" + j.ToString()));
        }
        public static void AddAndPrint(double i, double j)
        {
            Console.WriteLine(string.Format("The value is {0}", i.ToString() + "@" + j.ToString()));
        }
    }

 請注意,上面三個AddAndPrint函數除了參數類型以外,函數體內部實現完全一樣。那么我們會這樣調用它們:

        static void Main(string[] args)
        {
            MyHelper.AddAndPrint(100, 120);
            MyHelper.AddAndPrint(100.123F, 120F);
            MyHelper.AddAndPrint(100.456D, 120.666D);
            Console.ReadKey();
        }

 那么很容易就可以想到,AddAndPrint函數僅僅參數類型不一樣卻“不得不”寫了三次(如果是更多次呢),這顯然是不能接受的。這時候我們可以通過泛型來進行代碼重用。三個函數參數類型分別是int、float、double,那么我們合並三個函數為一個函數,參數類型就不能是任一確定類型,我們可以假定這個類型是T(取自Type首字母,當然.net許多類庫的代碼會使用諸如TEntityTElement之類的替代符可能更容易理解),那么我們可以將如上三個函數進行合並,如下:

        public static void AddAndPrint(T t1, T t2)
        {
            Console.WriteLine(string.Format("The value is {0}", t1.ToString() + "@" + t2.ToString()));
        }

 那么可以通過如下方式將類型傳入(因為是靜態函數,因此每次調用的時候在類名后面以如<int>的形式指定其類型,如果調用非靜態函數,那么在調用構造函數的時候指定即可):

    class MyHelper<T>
    {
         ...
     }

 注意,MyHelper<T>與AddAndPrint(T t1, T t2)須一致,當然也可以有多種類型,如MyHelper<T1,T2>與AddAndPrint(T1 t1,T2 t2),完整代碼如下:

    class MyHelper<T>
    {
        public static void AddAndPrint(T t1, T t2)
        {
            Console.WriteLine(string.Format("The value is {0}", t1.ToString() + "@" + t2.ToString()));
        }
    }

        static void Main(string[] args)
        {
            MyHelper.AddAndPrint(100, 120);
            MyHelper.AddAndPrint(100.123F, 120F);
            MyHelperAddAndPrint(100.456D, 120.666D);
            Console.ReadKey();
        }

 

 泛型集合簡單例子

     其實泛型集合不過是在編寫集合類(以及其節點Node類)時采用泛型而已。下面就以一個簡單的單向鏈表為例。

MyNode類,不指定Data的類型,以占位符T代替:

class MyNode<T>
    {
        public MyNode(T t)
        {
            this.Data = t;
        }
        public T Data { get; set; }
        public MyNode<T> Next { get; set; }
        public override string ToString()
        {
            return Data.ToString();
        }
    }

 那么我們的MyList類可以像下面這樣,僅僅簡單實現添加功能:

class MyList<T>
    {
        public MyNode<T> Head { get; set; }
        public MyList(T t)
        {
            Head = new MyNode<T>(t);
        }
        public void Append(T t)
        {
            MyNode<T> temp = this.Head;
            while (temp.Next != null)
            {
                temp = temp.Next;
            }
            MyNode<T> newNode = new MyNode<T>(t);
            temp.Next = newNode;
        }
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            MyNode<T> temp = this.Head;
            int index = 0;
            do
            {
                sb.Append(string.Format("The {0} Element is {1}\n", index, temp.Data.ToString()));
                index++;
                temp = temp.Next;
            }
            while (temp != null);
            return sb.ToString();
        }
    }

 調用:

        static void Main(string[] args)
        {
              MyList<string> myList = new MyList<string>("first");
              myList.Append("second");
              MyList<int> mylist2 = new MyList<int>(12);
              mylist2.Append(1231);
              Console.WriteLine(mylist2.ToString());
              Console.ReadKey();
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM