ボクシング/ボクシング - 価値のみタイプ? Ref.Types-キャスト?
質問
MSDNから、ボクシング/ボックス化が治療のためのものだと読んだ 価値 オブジェクトとしてのタイプ。しかし、ArrayListについて読んだとき、それはボクシングも同様に読むと読みます。 ArrayListが価値と参照タイプをオブジェクトとして保持しているため、私は非常に混乱しています。また、以下は、用語の観点からボックス化されていませんが、キャストするだけですか?
ArrayList a=new ArrayList();
a.Add(someClass);
someClass x=(someClass)a[0];
解決
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は値タイプの値をラップするオブジェクトを作成し、そのラッパー(値を保存する「ボックス」)への参照を返します。
他のヒント
ボクシング/ボックス化は、言語とランタイムの機能であり、の機能ではありません ArrayList
. 。大まかに言って、 それは、/からの値のタイプの変換です Object
タイプ, 、 それ以来 ArrayList
取り入れます Object
s、渡す値タイプは、自動的にボックス化されます box
IL指示。
より具体的には、ボクシング/ボックス化には、新しいオブジェクトの作成または調査、およびスタックからヒープまでの値タイプのデータのコピー(またはその逆)が含まれます。それはかなり高価であり、可能であればそれを避けたいです。
参照タイプの場合、通常、ボクシングコードは生成されません。どれか unbox
さらに、参照タイプで動作する命令は、単に無視されます。
値タイプをクラスタイプシステムの外側にあると考えると便利ですが、すべての値タイプは、同じメンバーのクラスとして本質的に動作するValuEType(順番に派生する)から派生した対応する参照タイプを持っていると見なします。 Fooとして、しかし、実際の価値の種類との間で拡大するキャストをサポートします。
値タイプがオブジェクトの派生物を期待するコードに渡される場合、適切な目に見えない参照タイプにキャストされます。その参照タイプのオブジェクトが値タイプの変数に割り当てられている場合、キャストされます。
ところで、druthersを持っている場合、デフォルトのキャスト方法以外の何かを使用する必要があることを指定する方法がありますが、そのような機能は存在しません。