C#基礎加強_泛型的基本原理

來源:互聯網
上載者:User

標籤:style   blog   color   資料   io   for   

 小弟初寫博文,深感“易敲千行碼,難下百餘文”的道理。

內容粗略淺薄,望各位大神海涵!

  • 動態數組ArrayList可以實現不斷的增長,讓我們感受到了在某些地方較數組有優越感。但它包含的數群組類型是object類,意味著需要轉為數組時,存在拆裝箱操作,這帶來不必要的麻煩,也損失了效能。而List<T>泛型集合的出現便大大解決了上述問題。
            //泛型 --泛指某一個類型。這種類型需要使用者自己確定            List<string> lists = new List<string>();            //添加元素            lists.Add("aa");            lists.Add("bb");            //遍曆元素時不用轉換類型
foreach (string item in lists) { Console.WriteLine(item); } lists[0] = "abcde"; lists.RemoveAt(0); for (int i = 0; i < lists.Count; i++) { Console.WriteLine(lists[i]); } Console.ReadKey();
  • 泛型集合在建立的時候就要求指定類型,所以在遍曆集合或轉數組時,直接就是資料的原有類型。其實我們也可以自己寫個類似的類實現泛型集合的準系統。
    //類的參數一般就是指型別參數    class MyList<T>:    {        T[] items=new T[4];        int count;        // 集合中元素個數        public int Count        {            get { return count; }            //set { count = value; }        }         // 添加元素        public void Add(T value)        {            if (this.Count == items.Length)            {                T[] newItems = new T[items.Length * 2];                items.CopyTo(newItems, 0);                items = newItems;            }            items[count] = value;            count++;        }         // 索引器        public T this[int index]        {            get            {                if (index < 0 || index >= this.Count)                {                    throw new ArgumentOutOfRangeException("no");                }                return items[index];            }            set            {                if (index < 0 || index >= this.Count)                {                    throw new ArgumentOutOfRangeException("no");                }                items[index] = value;            }        } 
  • 泛型直接通過<T>把元素的類型指定了,添加刪除元素和動態數組類似。但是當我們用foreach遍曆的時候,出問題了:
錯誤:“泛型的實現.MyList<int>”不包含“GetEnumerator”的公用定義,
因此 foreach 語句不能作用於“泛型的實現.MyList<int>”類型的變數。
  • 不包含GetEnumerator的公用定義?難道是要實現一個介面?通過反編譯器查到 LIST<T>真的實現了名為“IEnumerable”的介面。
   public interface IEnumerable    {        [DispId(-4), __DynamicallyInvokable]        IEnumerator GetEnumerator();    }
  • 那我們就實現“IEnumerable”這個介面吧,再看IEnumerator,是一個介面對象,原來GetEnumerator()要求返回一個"IEnumerator"的介面對象。糾結了,哪裡有這個對象啊。找不到,那我們自己寫個類來實現這個介面,不就ok了。
    class MyEnumerator<T> : IEnumerator    {        T[] items;         //類型的數組        int num;           //數組有效長度        int index = -1;    //迭代指標預設在-1的位置        //建構函式,        public MyEnumerator(T[] items, int num)        {            this.items = items;            this.num = num;        }        //擷取當前元素的值        public object Current        {            get            {                return items[index];            }        }          //先判斷有沒有下一個元素,如果有就將枚舉數推進到下一個元素        public bool MoveNext()        {            index++;            if (index >= num)            {                return false;            }            return true;        }         #endregion        // 迭代重設        public void Reset()        {            index = -1;        }     }
  • 原來IEnumerator介面就是為了實現迭代功能的,foreach遍曆的時候並不直接指向第0個元素,就像位置是在-1一樣,先來判斷有沒有第0個元素,沒有直接返回false,有則指標移到第0,再執行讀取。有了實現IEnumerator的類,就可以new一個MyEnumerator<T>對象來return了。
        //IEnumerable 成員--實現迭代         public IEnumerator GetEnumerator()        {                //你必須得返回一個實現了IEnumerator介面的類對象            return new MyEnumerator<T>(items, Count);        }
  • 現在,MyList<T>也擁有List<T>的準系統了哦,當然泛型還有很多其他的功能和特性,還有待我們去細細研究了。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.