2011-01-17 10 views
2

MSDNよりboxing/unboxingはの型をオブジェクトとして扱うためのものです。しかし、私はArrayListについて読んで、それはボクシングも同様に読み取ります。ですから、ArrayListはオブジェクトとして値型と参照型を保持するので、私はかなり混乱しています。 また、以下は、用語の点でアンボクシングではなく、そのキャストだけですか?ボクシング/アンボクシング - 値の種類のみ? Ref.types - キャスト?

ArrayList a=new ArrayList(); 
a.Add(someClass); 

someClass x=(someClass)a[0]; 
+1

'ArrayList'は' List 'によって廃止されました。http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx –

答えて

8

ArrayListは参照型ではなく値型のボクシングを実行します。あるいは、ArrayList自体はボクシングをしません - コンパイラは行います。たとえば:

ArrayList list = new ArrayList(); 
list.Add(5); 

を効果的

ArrayList list = new ArrayList(); 
object boxed = 5; // Perform boxing from value type type 
list.Add(boxed); 

あなたの例では、実際にちょうどキャスティングされている - 参照変換ではなく、アンボクシング変換。参照型の値は、ArrayListに格納されるためにボックス化する必要はありません。既に参照型です。

また、それは一般的なボクシングの真であり、ArrayListに特定ではない。ボクシングは、あなたが実際に参照をしたい値の型の値を使用する単なる方法です。参照はオブジェクトにする必要がありますので、CLRは値の型の値をラップするオブジェクトを作成し、その参照を返しますラッパー(値を格納する "ボックス")。

2

ボクシング/アンボクシングは言語とランタイムの機能であり、ArrayListの機能ではありません。大まかに言えば、it's the conversion of a value type from/to the Object typeであり、ArrayListObjectであるため、渡す値のタイプはbox IL命令で自動的に囲みます。

より具体的には、ボクシング/アンボクシングでは、新しいオブジェクトを作成または検査し、値タイプのデータをスタックからヒープにコピーします(またはその逆)。それはむしろ高価なので、可能ならば避けたいと思っています。

参照型の場合、ボクシングコードは通常生成されません。参照型で動作するunbox命令は、さらに単純に無視されます。

+0

あなたは依存関係のプロパティを使用できません... – GorillaApe

0

値型をクラス型システムの外にあると考えるのは有益ですが、すべての値型は、基本的にクラスとして動作するValueTypeから派生した目に見えない対応参照型(つまり、Objectから派生します) Fooと同じメンバであるが、実際の値のタイプとのキャストを拡大することをサポートする。

オブジェクトの派生を期待するコードに値型を渡すと、適切な不可視参照型にキャストされます。その参照型のオブジェクトが値型の変数に割り当てられている場合、その型はキャストバックされます。

私は自分のドリュータを持っていれば、デフォルトのキャスティング方法以外のものを使用するべきだと指定する方法がありますが、そのような機能はありません。