1. 程式人生 > >四:泛型

四:泛型

效能

裝箱拆箱

        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;
using 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(); } } }
View Code

一般來說,不用自己新建泛型類,只要使用.NET自帶的泛型類就可以了。比如List<T>。

泛型的功能

泛型不能把null賦值給泛型型別。

預設值

如果一個