java中泛型,C# 運行時中的泛型

 2023-10-08 阅读 29 评论 0

摘要:將泛型類型或方法編譯為 Microsoft 中間語言 (MSIL) 時,它包含將其標識為具有類型參數的元數據。?泛型類型的 MSIL 的使用因所提供的類型參數是值類型還是引用類型而不同。 第一次用值類型作為參數來構造泛型類型時,運行時會創建專用泛型類型,將提供的參

將泛型類型或方法編譯為 Microsoft 中間語言 (MSIL) 時,它包含將其標識為具有類型參數的元數據。?泛型類型的 MSIL 的使用因所提供的類型參數是值類型還是引用類型而不同。

第一次用值類型作為參數來構造泛型類型時,運行時會創建專用泛型類型,將提供的參數代入到 MSIL 中的適當位置。?對于每個用作參數的唯一值類型,都會創建一次專用泛型類型。

例如,假設您的程序代碼聲明了一個由整數構造的堆棧:

Stack<int> stack;

java中泛型、在此位置,運行時生成?Stack<T>?類的專用版本,并相應地用整數替換其參數。?現在,只要程序代碼使用整數堆棧,運行時就會重用生成的專用Stack<T>?類。?在下面的示例中,創建了整數堆棧的兩個實例,它們共享?Stack<int>?代碼的單個實例:

Stack<int> stackOne = new Stack<int>();
Stack<int> stackTwo = new Stack<int>();

但是,假定在代碼中的另一個位置創建了使用不同值類型(比如?long?或用戶定義的結構)作為其參數的另一個?Stack<T>?類。?因此,運行時將生成另一個版本的泛型類型,并在 MSIL 中的適當位置替換?long。?由于每個專用泛型類本身就包含值類型,因此不再需要轉換。

對于引用類型,泛型的工作方式略有不同。?第一次使用任何引用類型構造泛型類型時,運行時會創建專用泛型類型,用對象引用替換 MSIL 中的參數。?然后,每次使用引用類型作為參數來實例化構造類型時,無論引用類型的具體類型是什么,運行時都會重用以前創建的泛型類型的專用版本。?之所以可以這樣,是因為所有引用的大小相同。

例如,假設您有兩個引用類型:一個?Customer?類和一個?Order?類,并且同時假設您創建了一個?Customer?類型的堆棧:

class Customer { }
class Order { }
Stack<Customer> customers;

java 泛型類。此時,運行時將生成?Stack<T>?類的一個專用版本,該版本存儲稍后將填寫的對象引用,而不是存儲數據。?假設下一行代碼創建另一個引用類型的堆棧,該堆棧名為?Order:

Stack<Order> orders = new Stack<Order>();

不同于值類型,對于?Order?類型不創建?Stack<T>?類的另一個專用版本。?而是創建?Stack<T>?類的一個專用版本實例,并將?orders?變量設置為引用它。?假設接下來您遇到一行創建?Customer?類型堆棧的代碼:

customers = new Stack<Customer>();

與前面使用?Order?類型創建的?Stack<T>?類一樣,創建了專用?Stack<T>?類的另一個實例。?包含在其中的指針設置為引用?Customer?類型大小的內存區域。?因為引用類型的數量會隨程序的不同而大幅變化,C# 泛型實現將編譯器為引用類型的泛型類創建的專用類的數量減小到一個,從而大幅減小代碼量。

此外,使用值類型或引用類型參數實例化泛型 C# 類時,反射可以在運行時查詢它,并且可以確定它的實際類型及其類型參數。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/131718.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息