四:泛型
阿新 • • 發佈:2018-11-13
效能
裝箱拆箱
static void Main(string[] args) { var List = new ArrayList(); List.Add(44);//裝箱 int i = (int)List[0];//拆箱 foreach(int item in List) { Console.WriteLine(item);//拆箱 } Console.ReadLine(); }
裝箱拆箱是很平常的操作,但是問題是效能損失很大。
泛型的示例
static void Main(string[] args) { List<int> List = new List<int>(); List.Add(44);//沒有裝箱 int i = (int)List[0];//沒有拆箱 foreach(int item in List) { Console.WriteLine(item);//沒有拆箱 } Console.ReadLine(); }
使用泛型就沒有裝修和拆箱的效能損失。原因是程式碼編譯後就已經指定List的型別是int,也就是值型別,不會再轉換成Object型別。
型別安全
ArrayList新增的型別其實是Object。也就是說如果有型別的轉換可能會有問題。
但是List<T>的定義就只能新增整型型別。
命名約定
一般泛型的名稱以T作為字首,如果有多個泛型型別,可以在T字面後面新增描述性名稱
泛型類示例
using System; using System.Collections;View Codeusing System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyGeneric { class Program { static void Main(string[] args) { MyuLinkList<int> myList = new MyuLinkList<int>(); myList.AddList(1); myList.AddList(11); myList.AddList(111); foreach(var item in myList) { Console.WriteLine(item); } Console.ReadLine(); } } class MyuLinkListNode<T> { public MyuLinkListNode(T value) { this.Value = value; } public T Value { get; private set; } public MyuLinkListNode<T> Next { get; internal set; } public MyuLinkListNode<T> Prev { get; internal set; } } class MyuLinkList<T>:IEnumerable<T> { public MyuLinkListNode<T> First { get; internal set; } public MyuLinkListNode<T> Last { get; internal set; } public MyuLinkListNode<T> AddList(T node) { var newNode = new MyuLinkListNode<T>(node); if(First==null) { First = newNode; Last = First; } else { MyuLinkListNode<T> previous = Last; Last.Next = newNode; Last = newNode; Last.Prev = previous; } return newNode; } public IEnumerator<T> GetEnumerator() { MyuLinkListNode<T> current = First; while(current!=null) { yield return current.Value; current = current.Next; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }
一般來說,不用自己新建泛型類,只要使用.NET自帶的泛型類就可以了。比如List<T>。
泛型的功能
泛型不能把null賦值給泛型型別。
預設值
如果一個