2011-06-06 5 views
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はボクシング/アンボクシングの例ですか?

+0

私はあなたがオブジェクト "ボックス"にintを入れてから、それをそのボックスから撤退するので、そうだと思います。ボックスとunboxの背後にある考え方は、値型を参照型に変更して、 –

答えて

7

を期待するので:

iBoxediの箱入りコピーです。例2では

: がありToStringが、その後戻って、int.Parseによって解析されます最終的にはint.ToStringに解決された仮想方法であるとして、ここでは関係なしアンボクシングされていない非箱入りのスタックにint

例: iBoxedは、メソッドConvert.ToInt32の本文にボックス化されずに、ボックス化されていない整数としてスタックに戻されます。

+0

@dtb:はい、それは私が言ったことです。 unboxingは、私たちが見る行では実行されません。これは 'Convert.ToInt32'の本体で起こります。 –

+0

私はとにかくコンパイルされなかった例2を修正しました。 – Robert

+0

固定の例に従って私の答えを編集しました。 –

1

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

例2習慣作業int.Parseは、すべての3つの例では、文字列

+0

私が例2を修正したことです。Thx。 – Robert

2

2番目の例はボクシングですが、アンボックスしません。 int.parseはコンパイルされません。なぜなら、文字列が必要で、iBoxedがオブジェクトだからです。私はボクシングとコンバージョンのコンセプトを混在させていると思います。ボクシングは、実際には値の型、つまりPODをC言語で使用し、参照を解除するとその値をコンテナから取り出して同じ値の型を抽出することができるようになっています。すべての例では

例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. 
+0

例2を修正しました。 – Robert

0

、値型iはオブジェクトに変換されています。これはMSDNによるボクシングの定義です。アンボクシングが戻っ値型へのオブジェクトの変換である

object boxed = (object)i; 

:ボクシングもによって行うことができます。
例1、例2はParsestring引数を期待しているため、コンパイルに失敗しますが、Convert方法は、単に値を返しますので、私は疑う3がアンボクシングではありませんあなたはiBoxed.ToString()

例をした場合はアンボクシングだろう

アンボクシングであなたが渡します。

ボクシングとunboxingのパフォーマンスヒットを意識する価値がある。それは通常の割り当てよりも高価です。

関連する問題