第2回 6.ボックス化

ボックス化というのは、簡単に言うと、値型を参照型に変換する処理を指します。
もう少し説明を加えると、値型を使えるobjectクラスを生成します。値型を入れておけ
る参照型の箱を用意する、と、ボックス化という名前を元に説明すると、なるのですか
ね。
ボックス化するには、オブジェクト型に変換すればよいです。
逆にボックス化を外すには、ボックス化したオブジェクト型から値型へキャストして変
換します。
ボックス化すると、値型のデータをヒープ領域にコピーし、以後はその領域を使用する
ようになります。

ボックス化
int i = 123;
object o = i;

オブジェクトoに、iを代入する際は、暗黙的にキャストされています。
勿論明示的にキャストしても問題はありません。
その場合は
object o = (object)i;
のようになります。

こうすると、iは参照型の変数として使用出来るようになります。
注意しなければならないのは、iとoは異なる変数ということです。
何を馬鹿な、と思われるかもしれませんが……

int i = 123;
object o = i;
i = 456;

と、した場合、iには当然456が代入されていますが、oは123のままです。
iとoが共通のアドレスを持っているわけではありません。
あくまで、i用の参照型変数(クラス)を作成します。

ボックス化を解除する場合は
i = (int)o;

です。
キャストする型を間違えるとエラーになるので注意。

とはいえ、こんな風に、素直に(?)ボックス化をすることはまず無いと思います。
ぶっちゃけ使い道無いですからね。
ボックス化が役に立つのは、異なる型でも同一の関数で処理出来るようにする場合で
す。
例えば、引数に変数を渡し、その値を表示するプログラムを作れ、となった場合、変
数の型ごとに一個一個関数を作るのは面倒なうえ、アホです。
C++だと、テンプレート関数で対応できますけど。
ボックス化を使えば、一つの関数だけで処理することが出来ます。

       private void Form1_Load(object sender, EventArgs e)
       {
           int i = 123;
           TextOut( i );
       }

       private void TextOut(object data)
       {
           label1.Text = data.ToString();
       }

TextOutの引数はobject型。
Form1_Load関数で、引数に値型を渡しているので、暗黙的にボックス化します。
ここではintを渡していますが、byte型でもlong型でも渡してやることが出来ます。
まぁ、こんな単純な例のような使い方をすることは無いでしょうが、複数の型を扱うリ
ストを扱うときなどは重宝することでしょう。
事実、C#で準備されているリストクラスの引数はobject型になっています。

このように便利に見えるボックス化ですが、オーバーヘッドが大きいという問題があ
ります。
速度が重要になってくる場合は、よく考えて使う必要が出てきます。
最終更新:2007年09月06日 12:57
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。