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

歡迎訪問 生活随笔!

生活随笔

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

C#

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

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

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

內(nèi)容粗略淺薄,望各位大神海涵!


  • 動態(tài)數(shù)組ArrayList可以實現(xiàn)不斷的增長,讓我們感受到了在某些地方較數(shù)組有優(yōu)越感。但它包含的數(shù)組類型是object類,意味著需要轉(zhuǎn)為數(shù)組時,存在拆裝箱操作,這帶來不必要的麻煩,也損失了性能。而List<T>泛型集合的出現(xiàn)便大大解決了上述問題。
//泛型 --泛指某一個類型。這種類型需要用戶自己確定List<string> lists = new List<string>();//添加元素lists.Add("aa");lists.Add("bb");//遍歷元素時不用轉(zhuǎn)換類型
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();
  • 泛型集合在創(chuàng)建的時候就要求指定類型,所以在遍歷集合或轉(zhuǎn)數(shù)組時,直接就是數(shù)據(jù)的原有類型。其實我們也可以自己寫個類似的類實現(xiàn)泛型集合的基本功能。
//類的參數(shù)一般就是指類型參數(shù)class MyList<T>:{T[] items=new T[4];int count;// 集合中元素個數(shù)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>把元素的類型指定了,添加刪除元素和動態(tài)數(shù)組類似。但是當我們用foreach遍歷的時候,出問題了:
錯誤:“泛型的實現(xiàn).MyList<int>”不包含“GetEnumerator”的公共定義,
因此 foreach 語句不能作用于“泛型的實現(xiàn).MyList<int>”類型的變量。
  • 不包含GetEnumerator的公共定義?難道是要實現(xiàn)一個接口?通過反編譯器查到 LIST<T>真的實現(xiàn)了名為“IEnumerable”的接口。
public interface IEnumerable{[DispId(-4), __DynamicallyInvokable]IEnumerator GetEnumerator();}
  • 那我們就實現(xiàn)“IEnumerable”這個接口吧,再看IEnumerator,是一個接口對象,原來GetEnumerator()要求返回一個"IEnumerator"的接口對象。糾結(jié)了,哪里有這個對象啊。找不到,那我們自己寫個類來實現(xiàn)這個接口,不就ok了。
class MyEnumerator<T> : IEnumerator{T[] items; //類型的數(shù)組int num; //數(shù)組有效長度int index = -1; //迭代指針默認在-1的位置//構(gòu)造函數(shù),public MyEnumerator(T[] items, int num){this.items = items;this.num = num;}//獲取當前元素的值public object Current{get{return items[index];}} //先判斷有沒有下一個元素,如果有就將枚舉數(shù)推進到下一個元素public bool MoveNext(){index++;if (index >= num){return false;}return true;} #endregion// 迭代重置public void Reset(){index = -1;} }
  • 原來IEnumerator接口就是為了實現(xiàn)迭代功能的,foreach遍歷的時候并不直接指向第0個元素,就像位置是在-1一樣,先來判斷有沒有第0個元素,沒有直接返回false,有則指針移到第0,再執(zhí)行讀取。有了實現(xiàn)IEnumerator的類,就可以new一個MyEnumerator<T>對象來return了。
//IEnumerable 成員--實現(xiàn)迭代 public IEnumerator GetEnumerator(){//你必須得返回一個實現(xiàn)了IEnumerator接口的類對象return new MyEnumerator<T>(items, Count);}
  • 現(xiàn)在,MyList<T>也擁有List<T>的基本功能了哦,當然泛型還有很多其他的功能和特性,還有待我們?nèi)ゼ毤氀芯苛恕?/li>

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/lant-li/p/3843840.html

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。