C#でのボクシングとアンボクシングの違い
コンテンツ
C#では、すべての値の型はクラスオブジェクトから派生します。したがって、オブジェクト型の参照変数は、他の値の型を参照できます。 C#は、値の型を参照型にリンクする2つのメソッドをBoxingとUnboxingに導入します。 BoxingとUnboxingの基本的な違いは、Boxingは値型からオブジェクト型への変換であるのに対して、Unboxingという用語はオブジェクト型から値型への変換を指すことです。 BoxingとUnboxingのその他の違いを調べてみましょう。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | ボクシング | 開梱 |
---|---|---|
ベーシック | オブジェクトタイプは値タイプを指します。 | ボックス化されたオブジェクトから値を取得するプロセス。 |
ストレージ | スタックに格納されている値は、ヒープメモリに格納されているオブジェクトにコピーされます。 | ヒープメモリに格納されているオブジェクト値は、スタックに格納されている値型にコピーされます。 |
変換 | 暗黙的な変換。 | 明示的な変換。 |
例 | int n = 24; オブジェクトob = n; | int m =(int)ob; |
ボクシングの定義
ボクシングは、値の型をオブジェクト型に変換する手順です。ここで、値の型はスタックに格納され、オブジェクトの型はヒープメモリに格納されます。値型からオブジェクト型へのこの変換は、暗黙的な変換です。オブジェクトに値を直接割り当てることができ、C#が残りの変換を処理します。例でボクシングを理解しましょう。
int i = 24;オブジェクトob = i; //整数型nをオブジェクト型obにボックス化します。またはオブジェクトob1 = 21; //ここでもオブジェクト型ob1は整数型を指します
上記のコードでは、値24を含む整数型iがスタックに格納され、オブジェクト型obにコピーされます。オブジェクト型は整数値を参照しています。現在、「int i」には値24も含まれ、「object type ob」にも値24が含まれていますが、両方の値は互いに独立しています。つまり、iの値を変更しても、変更は反映されません。 obの値。
ボクシングは、余分な時間とともに余分なメモリを消費します。その理由は、値型を参照する新しいオブジェクトがヒープ上のメモリスペースを割り当てる必要があるためです。次に、スタックに格納されている値型の値は、ヒープメモリの場所にあるオブジェクト型に転送されます。
開梱の定義
ボクシングの逆は、ボクシング解除です。ボックス化解除は、オブジェクト型を値型に変換することです。ボックス化解除では、ヒープに格納されているボックス化されたオブジェクト型の値は、スタックに格納されている値型に転送されます。ボクシングとは異なり、ボクシング解除は明示的に行う必要があります。オブジェクト型は明示的に値型にキャストされ、値型はオブジェクト型が参照している値と同じでなければなりません。例を使用して、ボックス化解除の概念を理解しましょう。
int i = 24;オブジェクトob = i; //整数型nをオブジェクト型obにボックス化します。 int j =(int)ob; //オブジェクト型obに保存されている整数値を整数型yにボックス化解除します。
オブジェクトobに格納されている値は、オブジェクトが参照しているのと同じ型、つまり整数型「j」にキャストすることで取得されます。
また、ボックス化解除は、より多くのメモリと時間を消費します。オブジェクト型のボックス化を解除する必要がある場合、ヒープに格納されているオブジェクト型の値を、スタックに格納されている新しい値型に転送する必要があるためです。取得された値を持つオブジェクトタイプは、ガベージコレクションに使用できるようになります。
- ボクシングでは、オブジェクトは値の型として参照されます。一方、ボックス化されたオブジェクトから値を取得するプロセスは、ボックス化解除と呼ばれます。
- スタックに格納されている値型は、ヒープメモリに格納されているオブジェクトにコピーされます。一方、ボックス化解除では、ヒープメモリに格納されているオブジェクトは、スタックメモリに格納されている値型にコピーされます。
- ボクシングは暗黙的な変換ですが、ボックス化解除は明示的な変換です。
結論:
ボクシングとアンボクシングはどちらもより多くの時間とメモリを消費し、計算コストが高くなります。また、型の安全性に欠け、実行時のオーバーヘッドが増加します。プログラムでのボクシングとボックス解除の過度の使用を避けることを常にお勧めします。