ボックス化、ボックス化解除はパフォーマンスの負荷が高いので速度が要求される場面では控えるようにすると良い
ボックス化とボックス化解除は、負荷の大きい処理です。値型をボックス化するときは、完全に新しいオブジェクトを作成する必要があります。
これには、単純な参照割り当てと比較して最大 20 倍もの時間がかかることがあります。
また、ボックス化を解除するときは、キャストのプロセスで代入の 4 倍の時間がかかることがあります。
<注意点>
ボックス化する前の型とボックス化解除する時の型は合わせておく必要がある
(intをボックス化したなら、そのオブジェクトはintで解除しないと例外エラーになる。大抵、実行時に判明するのでキャッチするなどの注意が必要)
class BoxTest
{
public BoxTest()
{
int i = 123;
object o = i; //これがボックス化。整数の変数 i をボックス化し、オブジェクト o に代入しています
o = "abc"; //オブジェクトには何でも入れれるが常にボックス化が行われるのでパフォーマンスの負荷が高い
string str = (string)o; //これがボックス化解除
//string.Concatの例。これはオブジェクトの文字列形式を連結する関数ですが引数によりいくつかのバージョンがあります
//ここでは引数に3つのオブジェクトが与えられてるバージョンで動作しています
//この場合、42とtrueはSystem.StringではないのでSystem.objectにボックス化されています
Console.WriteLine(string.Concat("Answer", 42, true));
//intとstringが混じったobjectのリストを作成
List<object> mix = new List<object>();
mix.Add("FirstGroup");
for (int l = 1; l < 5; l++)
{
mix.Add(l);
}
mix.Add("SecondGroup");
for (int l = 5; l < 10; l++)
{
mix.Add(l);
}
foreach (var item in mix)
{
Console.WriteLine(item);
}
var sum = 0;
for (int l = 1; l < 5; l++)
{
//sum += mix[l] * mix[l]; //object同士は値でないので演算できない旨エラーが出る
sum += (int)mix[l] * (int)mix[l]; //ボックス化を解除しているので演算可能
//stringを(int)で解除しようとすると例外エラーが出るので注意
}
Console.WriteLine("sum= " + sum); //sum は 1 + 4 + 9 + 16 で 30となる
}
}
最終更新:2012年05月30日 12:49