日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#基础加强_泛型的基本原理

發布時間:2023/11/30 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#基础加强_泛型的基本原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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


  • 動態數組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>的基本功能了哦,當然泛型還有很多其他的功能和特性,還有待我們去細細研究了。

?

?

轉載于:https://www.cnblogs.com/lant-li/p/3843840.html

總結

以上是生活随笔為你收集整理的C#基础加强_泛型的基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。