推奨されます, 2024

エディターズチョイス

C#でのボクシングとアンボクシングの違い

C#では、すべての値型はクラスオブジェクトから派生しています。 そのため、オブジェクト型の参照変数は他の値型を参照できます。 C#では、BoxingとUnboxingに2つの方法が導入されています。これは、値型を参照型にリンクします。 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"にキャストすることによって取得されます。

ボックス化解除はまたより多くのメモリとより多くの時間を消費します。 オブジェクトタイプのボックスを解除する必要がある場合は、ヒープに格納されているオブジェクトタイプの値をスタックに格納されている新しい値タイプに転送する必要があります。 値が取得されたオブジェクトタイプは、ガベージコレクションに使用できるようになります。

ボクシングとアンボクシングの主な違い

  1. ボクシングでは、オブジェクトを値型として参照するようにします。 一方、ボックス化されたオブジェクトから値を取得するプロセスは、ボックス化解除と呼ばれます。
  2. スタックに格納されている値型は、ヒープメモリに格納されているオブジェクトにコピーされます。 一方、ボックス化解除では、ヒープメモリに格納されているオブジェクトは、スタックメモリに格納されている値型にコピーされます。
  3. ボクシングは暗黙的な変換であるのに対し、ボックス化解除は明示的な変換です。

結論:

ボクシングとアンボクシングの両方とも、より多くの時間とメモリを消費し、そしてそれらは計算上高価である。 それらはまた型安全性に欠け、実行時のオーバーヘッドを増加させます。 それは常にプログラムでボクシングとアンボクシングの過度の使用を避けることをお勧めします。

Top