2

MSDNから、ボクシング/アンボクシングは型をオブジェクトとして扱うためのものであると読みました。しかし、ArrayListについて読むと、ボクシングも行うことがわかります。したがって、ArrayListは値型と参照型をオブジェクトとして保持するため、私はかなり混乱しています。また、以下は用語の観点から開開ではなく、ただキャストしているだけですか?

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

someClass x=(someClass)a[0];
4

3 に答える 3

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は値型の値をラップするオブジェクトを作成し、そのラッパーへの参照を返します(値を格納する「ボックス」)。

于 2011-01-17T07:46:47.767 に答える
2

ボクシング/アンボクシングは言語とランタイムの機能であり、の機能ではありませんArrayList。大まかに言えば、これは値型から型への変換であり、ObjectsArrayListを取り込むため、渡す値型はすべてIL命令Objectで自動的にボックス化されます。box

より具体的には、ボックス化/ボックス化解除には、新しいオブジェクトの作成または調査、および値型のデータのスタックからヒープへのコピー(またはその逆)が含まれます。それはかなり高価です、そしてあなたは可能であればそれを避けたいです。

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

于 2011-01-17T07:47:01.437 に答える
0

値型をクラス型システムの外にあると考えると便利ですが、すべての値型は、本質的に同じメンバーを持つクラスとして動作する、ValueTypeから派生した(次にObjectから派生した)非表示の対応する参照型を持っていると見なしますFooと同じですが、実際の値型との間のキャストの拡大をサポートします。

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

ところで、もし私がドラザーを持っていたら、デフォルトのキャスト方法以外のものを使用するように指定する方法がありますが、そのような機能は存在しません。

于 2011-01-26T17:26:17.110 に答える