5

2 と 3 のボックス化/ボックス化解除の例はありますか?

1) ドキュメントの例:

int i = 123;
object iBoxed = i;
i = (int) iBoxed;

2: ボックス化/ボックス化解除も同様ですか?

int i = 123;
object iBoxed = i;
i = Int32.Parse(iBoxed.ToString());

3: ボックス化/ボックス化解除も同様ですか?

int i = 123;
object iBoxed = i;
i = Convert.ToInt32(iBoxed);

すべての例で技術的に同じことが起こると思います。

  1. スタック上に値型が作成されます
  2. スタック上に参照が作成され、値がヒープにコピーされます。
  3. ヒープ値が参照にコピーされます。参照が削除されます。

2 と 3 は、ボクシング/アンボクシングの例だと思いますか?

4

4 に答える 4

7

3 つの例すべてで:

iBoxedの箱入りコピーですi

例 2: ここではボックス化解除は行われません。ToString仮想メソッドは最終的に に解決され、int.ToStringによって解析され、ボックス化されていないものをスタックint.Parseに返します。int

例 3 では iBoxed、メソッドの本体でボックス化が解除され、Convert.ToInt32ボックス化されていない整数として再びスタックに返されます。

于 2011-06-06T08:20:10.833 に答える
2

2 番目の例はボックス化ですが、ボックス化解除ではありません。int.parse は文字列を想定しており、iBoxed はオブジェクトであるため、コンパイルされません。ボクシングとコンバージョンの概念を混同していると思います。ボクシングとは、C で言うように値の型、つまり POD を取得し、それを参照として扱うことです。ボックス化解除とは、コンテナーから同じ値の型を抽出する機能です。

例 2.固定

int i = 123;  // Assigment 
object iBoxed = i ; // This is boxing 
i = int.parse(iBoxed.toString());  //This is unboxing but only for the twostring method the assignment is a value type copy. 
于 2011-06-06T08:20:35.890 に答える
1

それobject iBoxed = iはボクシングをする人です。

例 2int.Parseは文字列を想定しているため機能しません

于 2011-06-06T08:19:59.680 に答える
0

すべての例で、値の型iがオブジェクトに変換されています。これはMSDNによるボクシングの定義です。ボクシングは次の方法でも実行できます。

object boxed = (object)i;

ボックス化解除は、オブジェクトを値型に戻す変換です。
例 1 は開封です

例 2 は引数をParse期待しているためコンパイルに失敗しますが、そうするとボックス化解除されますstringiBoxed.ToString()

例 3Convertメソッドは渡された値を返すだけなので、ボックス化解除されていないと思われます。

ボックス化とボックス化解除のパフォーマンスへの影響を認識しておく価値があります。通常の割り当てよりも費用がかかります。

于 2011-06-06T08:22:57.370 に答える