每日心得 對泛型的一些認識

2021-06-18 15:18:28 字數 2389 閱讀 4715

我認為**重用的思想為泛型的出現起到了至關重要的作用。而且泛型也毫無疑問的做到了這點。

泛型具有型別安全,高效能,**重用等諸多優點,但是我認為最重要的是他實現了**的重用。

接下來我列出一些**:

如上所示我已經利用泛型建立了乙個可以前序遍歷也可以後續遍歷的鍊錶。這個鍊錶可以支援任何型別的資料,借助於泛型我們就不必為整形,浮點型,字串,類。等等一系列的資料型別建立多個有著相同處理方式,相同**的類,這樣極大的提高了程式設計師的效率。當然大多時候我們不必去自己編寫泛型**,我們更多的時候可以去利用.net平台提供的集合完成上述處理。但是這並不能完全取代我們的工作,畢竟平台提供的**並不總是我們所需要的。泛型與模板一樣為我們程式設計師所追求的目標**重用提供了至關重要的支援。

以上內容只是我們使用了泛型,但是想必大家和我一樣都相當關心,泛型的實現。他是如何在clr的操作下處理更種各樣的例項化操作?例項化**如何儲存?接下來的內容算不上我的原創,以下內容來至於

我只是充當了乙個搬運工的角色,畢竟在我看來對於.net最專業的還是微軟。

將泛型型別或方法編譯為 microsoft 中間語言 (msil) 時,它包含將其標識為具有型別引數的元資料。

泛型型別的 msil 的使用因所提供的型別引數是值型別還是引用型別而不同。

第一次用值型別作為引數來構造泛型型別時,執行時會建立專用泛型型別,將提供的引數代入到 msil 中的適當位置。

對於每個用作引數的唯一值型別,都會建立一次專用泛型型別。例如以stack實現乙個int型的棧結構。

但是,假定在**中的另乙個位置建立了使用不同值型別(比如 long 或使用者定義的結構)作為其引數的另乙個 stack 類。

因此,執行時將生成另乙個版本的泛型型別,並在 msil 中的適當位置替換 long。

由於每個專用泛型類本身就包含值型別,因此不再需要轉換。

對於引用型別,泛型的工作方式略有不同。

第一次使用任何引用型別構造泛型型別時,執行時會建立專用泛型型別,用物件引用替換 msil 中的引數。

然後,每次使用引用型別作為引數來例項化構造型別時,無論引用型別的具體型別是什麼,執行時都會重用以前建立的泛型型別的專用版本。

之所以可以這樣,是因為所有引用的大小相同。

提到泛型類,我們當然可以建立泛型方法,就像c++中既有函式模板又有類模板。泛型相較於c++的模板函式更加的安全,c#不允許在函式中對泛型型別使用『+』或『-』這種只能作用於特定型別的算術操作符,而對於c++則沒有這層限制。因為從本質上講泛型的目的是獲得任意型別的支援。不能再例項化某些未過載『+』或『-「操作符的型別中出現異常。

這是乙個實現了交換值的泛型方法。或許有些人覺得泛型的方法並不是必須存在的,我們實現了泛型類,泛型介面,泛型指代等等。我們在物件導向的指引下不需要什麼泛型方法泛型類等已經從很大程度上實現了型別分離的通用**。但是泛型方法為通用演算法的實現卻也是功不可沒。math類作為乙個靜態類,其中包含了很多靜態的方法。在msdn中開啟這個類的介紹,我們會發現有相當多的函式過載,或許利用泛型能夠減少一些**量,畢竟在c++中都存在有標準演算法的概念。譬如說比較演算法,我們沒有必要千方百計的為整型,實型,字串等等實現一些大致相同的演算法。

但是正如上面所說為了實現一致性,為了能讓所有的型別均能夠完美的呼叫泛型方法,我們不能在泛型方法中對泛型型別使用諸如』+『,』-『,』>『等一系列運算子,因為或許有些型別並未實現了上述操作符由此引發錯誤。但是如果我們將泛型方法與泛型委託結合起來使用或者就能夠讓方法更加通用,而不再與某個型別相關。

通過這種形式我們就可以定義自己的通用方法,而不受引數型別的約束。從而極大的提高了**的重用能力。

每日心得 關於C 中委託與事件的一些認識 一

大家都知道在我們一開始學習程式語言中的函式時,我們所傳入的引數統統為資料型別。所以當我們學習委託的時候難免會有些疑惑,為什麼函式傳入了乙個方法?為什麼不在內部呼叫方法?或者為什麼能夠傳入方法?現在根據我所學的內容來和大家一起解決這些問題。人是經驗型的動物,以往的知識難免會對新所學習的知識造成影響,而...

對java泛型的認識。

泛型是jdk1.5以後出現的新的機制,可以將型別異常在編譯時期被發現。那麼什麼時候用到它呢?泛型分為 泛型定義在類上,定義在方法上,定義在靜態方法上,定義在介面上。定義在類上時 一般是某類變數在此類中多處被用到,但不確定型別。定義在方法上 一般是形參型別不確定。定義在介面上 與定義在類上意義相似,子...

泛型的一些理解

泛型是為了解決型別不確定的問題,業務邏輯相同只有物件型別不同。是屬於編譯期的,編譯器編譯完之後,帶有泛型的程式,生成的.class位元組碼檔案中將不存在泛型。以此使程式在執行時效率不受影響,這個過程被稱為泛型 擦除 泛型泛型又可以分為集合泛型和自定義泛型。一 集合泛型 list list1 new ...