溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#泛型如何應用

發(fā)布時間:2021-12-03 10:04:53 來源:億速云 閱讀:127 作者:iii 欄目:編程語言

這篇文章主要介紹“C#泛型如何應用”,在日常操作中,相信很多人在C#泛型如何應用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#泛型如何應用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

我們在編寫C#程序的時候,經(jīng)常遇到兩個模塊的功能非常相似,只是一個是處理int類型,另一個是處理string類型,或者是其他自定義的數(shù)據(jù)類型,但我們沒有其他的解決方案,只能各自寫多個方法處理每個數(shù)據(jù)類型,因為方法的參數(shù)類型不同。那么是否有一個辦法,在方法中傳入通用的數(shù)據(jù)類型,這樣就可以合并代碼了。C#泛型應用正是為解決這個問題的。C#泛型應用可以解決什么樣的問題呢?我們先看下面的代碼,代碼中省略了一些內(nèi)容,但功能是實現(xiàn)一個棧,這個棧只能處理int數(shù)據(jù)類型:

public class Stack  {     private int[] m_item;     public int pop() {}     public void push(int item) {}     public Stack(int i) {this.m_item = new int[i]; }  }

上面的代碼運行得很好,但是,如果我們需要一個棧來保存string類型的數(shù)據(jù)時呢?或許很多人都會想到把上面的代碼copy一份,把int改成string就可以了。當然,這樣做,是沒問題的,但是如果以后需要long,Node類型的棧該怎么辦?繼續(xù)復制?這里有種折衷的辦法,是使用一個通用的數(shù)據(jù)類型object來實現(xiàn)這個棧:

public class Stack  {     private object[] m_item;     public object pop() {}     public void push() {}      public Stack(int o){this.m_item = new object [o]}  }

雖然這個棧很靈活,可以接收任何數(shù)據(jù)類型。但全面地說,也不是沒有缺陷的,主要表現(xiàn)在:

◆當Stack處理值類型時,會出現(xiàn)裝箱,拆箱操作,這將在托管堆上分配和回收大量的變量,若數(shù)據(jù)量大,則性能損失非常嚴重。

◆在處理引用類型時,雖然沒有裝箱和拆箱操作,但將用到數(shù)據(jù)類型的強制轉(zhuǎn)換操作,增加了處理器的負擔。

在數(shù)據(jù)類型的強制轉(zhuǎn)換上還有更嚴重的問題,如下:

Node1 x = new Node1();  stack.push(x);  Node2 y = (Node2)stack.pop();

上面的代碼在編譯時是沒有問題的,但是由于push了一個Node1類型的數(shù)據(jù),但在pop時卻要求轉(zhuǎn)換為Node2類型,這將出現(xiàn)程序運行時的類型轉(zhuǎn)換異常,但卻逃離了編譯器的檢查。
針對object類型棧的問題,我們引入泛型,他可以很優(yōu)雅地解決這些問題。泛型用一個通過的數(shù)據(jù)類型T來代替object,在類實例化時指定T的類型,運行時(Runtime)自動編譯為本地代碼,運行效率和代碼質(zhì)量都有很大的提高,并且保證數(shù)據(jù)類型安全。

C# 泛型應用實例:

下面是使用泛型來重寫上面的棧,用一個通用的數(shù)據(jù)類型T來作為一個占位符,等待在實例化時用一個實際的類型來替換。如下:

public class Stack﹤T﹥  {     private T[] m_item;     public T pop() {}     public void push(T item) {}      public Stack(int i)     {      this.m_item = new T[i];     }  }

類的寫法不變,只是引入了通用數(shù)據(jù)類型T就可以適用于任何數(shù)據(jù)類型,并且類型安全的。這個類的調(diào)用方法:

Stack﹤int﹥ a = new Stack﹤int﹥(100);  a.push(10);  a.push("10"); //這里編譯不通過,因為類a只接收int類型的數(shù)據(jù)  int x = a.pop();   Stack﹤string﹥ b = new Stack﹤string﹥(100);  b.push(10); //這里編譯不通過,因為類b只接收string類型的數(shù)據(jù)庫  b.push("10");  string y = b.pop();

這個類和object實現(xiàn)的類有截然不同的區(qū)別:

1. 他是類型安全的。實例化了int類型的棧,就不能處理string類型的數(shù)據(jù),其他數(shù)據(jù)類型也一樣;

2. 無需裝箱和拆箱。這個類在實例化時,按照鎖傳入的數(shù)據(jù)類型生成本地代碼,本地代碼數(shù)據(jù)類型已確定,所以無需裝箱和拆箱。

3. 無需數(shù)據(jù)類型轉(zhuǎn)換。

到此,關于“C#泛型如何應用”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI