プリミティブ データ型間でデータ型を変換することを、データ型キャストと呼びます。
しかし、ValueType と ReferenceType の間で変換する場合、これをボックス化およびボックス化解除と呼びます。
ボックス化とボックス化解除もキャスティングと呼ぶことができますか?
ボクシングは、基本的に、値の型をオブジェクト ハルにラップするだけです。たとえば、実際には型変換は必要ありません(int)3.14
。どちらもキャスト演算子を使用していますが。
C# 型システムには、値型、参照型、およびポインター型の 3 つの型が含まれています。C# では、値の型を参照型に変換し、再び値の型に戻すことができます。値型を参照型に変換する操作はボックス化と呼ばれ、逆の操作はボックス化解除と呼ばれます。
ボクシング
int Val = 1;
Object Obj = Val; //Boxing
最初の行では、値の型 Val を作成し、値を Val に割り当てました。2 行目では、Object Obj のインスタンスを作成し、Val の値を Obj に割り当てています。上記の操作 (Object Obj = i ) から、Value Type の値を対応する Reference Type の値に変換することがわかりました。これらのタイプの操作は、ボクシングと呼ばれます。
アンボクシング
int Val = 1;
Object Obj = Val; //Boxing
int i = (int)Obj; //Unboxing
最初の 2 行は、値の型をボックス化する方法を示しています。次の行 (int i = (int) Obj) は、 Object から Value Type を抽出することを示しています。つまり、参照型の値を値型の値に変換しています。この操作は UnBoxing と呼ばれます。
Boxing と UnBoxing は計算コストの高いプロセスです。値型がボックス化されると、まったく新しいオブジェクトを割り当てて構築する必要があり、UnBoxing に必要なキャストも計算コストが高くなります。
すべての null 非許容値型には、同一のメンバーを持つヒープ オブジェクト型が関連付けられています。値型の格納場所をボックス化すると、新しいヒープ型インスタンスが作成され、すべてのフィールドが値型の格納場所から新しいインスタンスの対応するフィールドにコピーされます。値型のボックス化を解除すると、対応するヒープ オブジェクト型のインスタンスのすべてのフィールドが、値型の格納場所の対応するフィールドにコピーされます。
ボックス化は基本的に、値の型を後でボックス化解除できる匿名オブジェクトにボックス化することです。
int x = 567;
object y = x; //boxing
int z = (int) y; //z will be 123
int x = 567;
object y = (object)x; //explicit boxing (not necessary)
int z = (int) y; //z will be 123
ボックス化/ボックス化解除を型キャストと混同しないでください。ボックス化は単に変数の周りにラッパーを置いているだけだからです。型キャストを行うことで、変数またはオブジェクトの型を実際に変更しています。
Double x = 3.14444;
Integer y = (Integer)x; //(type cast or static cast in c++) changing the type and loosing the original value too in this case.
int x = 567;
object y = (object)x; //explicit boxing (not necessary)
float z = (float) y; //another example of type casting while unboxing
キャスト:(基本的には、あるタイプのインスタンスを別のタイプに変換することです)
int a = (int) 3.14 // from the example above does casting with loosing precision.
double b = a; // casting again (we may write (double) a - gives the same result).
ボクシング: (値の型をヒープにコピーするプロセス)
object c = new MyStruct(); // MyStruct = struct.
object d = 1;
object e = (int) 3.14; // here we have actually casting and then boxing.
ボックス化解除 (ボックス化された値の型をスタックにコピー):
Button f = (MyStruct) c;
int g = (int) d; // it still unboxing however it looks exactly like the line #1 above.
それが役に立てば幸い。
ボックス化は、値型を型オブジェクトに変換し、ボックス化解除して値を取得するプロセスですhttp://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
キャストとは、あるタイプを別の互換性のあるタイプに変換することです