C 裝箱 拆箱 泛型

2021-08-05 23:30:16 字數 2212 閱讀 4841

1、裝箱:值型別轉引用型別。開闢一塊記憶體空間進行存放資料。

2、拆箱:引用型別轉值型別。

值型別存放在棧上,引用型別存放在堆上。

裝箱需要消耗記憶體,所以引出了泛型。

泛型:1. 使用非泛型集合時引發的裝箱和拆箱操作 

看下面的一段**:

1

2

3

4

5

6

7

8

vararray =newarraylist();

array.add(1);

array.add(2);

foreach(intvalueinarray)

」,value);

}

**宣告了乙個arraylist物件,向arraylist中新增兩個數字1,2;然後使用foreach將arraylist中的元素列印到控制台。

在這個過程中會發生兩次裝箱操作和兩次拆箱操作,在向arraylist中新增int型別元素時會發生裝箱,在使用foreach列舉arraylist中的int型別元素時會發生拆箱操作,將object型別轉換成int型別,在執行到console.writeline時,還會執行兩次的裝箱操作;這一段**執行了6次的裝箱和拆箱操作;如果arraylist的元素個數很多,執行裝箱拆箱的操作會更多。

2. 使用泛型集合的情況

請看如下**:

varlist =newlist<int>();

list.add(1);

list.add(2);

foreach(intvalueinlist)

", value);

}

**和1中的**的差別在於集合的型別使用了泛型的list,而非arraylist;我們同樣可以通過檢視il**檢視裝箱拆箱的情況,上述**只會在console.writeline()方法時執行2次裝箱操作,不需要拆箱操作。

可以看出泛型可以避免裝箱拆箱帶來的不必要的效能消耗;當然泛型的好處不止於此,泛型還可以增加程式的可讀性,使程式更容易被復用等等。

泛型約束:

下表列出了五類約束:

約束

描述

where t: struct

型別引數必須為值型別。

where t : class

型別引數必須為型別。

where t : new()

型別引數必須有乙個公有、無參的建構函式。當與其它約束聯合使用時,new()約束必須放在最後。

where t :

型別引數必須是指定的基型別或是派生自指定的基型別。

where t :

型別引數必須是指定的介面或是指定介面的實現。可以指定多個介面約束。介面約束也可以是泛型的。

如果你希望t是乙個int的集合,這個集合可以是list,也可以是hashset等等,只要它們都是從icollection繼承而來的,則可以新增對型別t的限定,同時要保證它還是可以例項化的:

複製**

**如下:

public t returnelement() 

where t : icollection, new() 

進一步,如果希望放寬集合中元素的型別,比如只要是int,double等可比較的型別,它們都是從icomparable繼承而來,則可以繼續新增如下限定:

複製**

**如下:

public t returnelement() 

where t : icollection, new() 

where s : icomparable   

C 委託 泛型 事件 裝箱拆箱

一 委託 我感覺的委託就是指乙個函式指標,指向被委託的方法,在定義的時候把返回值型別與引數全部定義好,建立的例項相當於乙個指向被委託函式的指標,然後將需要的資料通過委託傳進去 是先呼叫委託例項,然後委託例項再呼叫方法 簡寫的那種方式更能體現它像乙個函式指標 注意 多播委託就是用 與 進行操作 當多播...

從裝箱拆箱看泛型

net很容易把值型別轉換為引用型別,所以可以在需要物件的任意地方使用值型別。例如int可以賦予乙個物件,從值型別轉換為引用型別稱為裝箱。如果方法需要把乙個物件作為引數,同時傳遞乙個值型別,裝箱操作就會自動進行。另一方面,裝箱的值型別可以使用拆箱操作轉換為值型別。定義乙個一般的 非泛型的簡化鍊錶類,它...

java學習 裝箱與拆箱 泛型

把基本資料型別賦給對應的包裝類。比如 把int賦值給integer,對他的操作就需要用它的方法了。是值型別轉換為引用型別的過程。把乙個包裝類賦給基本資料型別。由引用型別轉換為值型別的過程。integer i 1 裝箱 int j i 拆箱 典型應用 list list new arraylist l...