こんにちは、Unityエンジニアのオオバです。
今回も小ネタです。
時々以下のようなコードに出会います。
void Foo ()
{
List list = new List(){0, 1, 2, 3, 4,5, 6};
Convert(list.ToArray());
}
void Convert (int[] arr)
{
// Do Something....
}
一見問題なさそうなのですが、ToArray
関数をわざわざ呼んでいるのが気になります。

このようにヒープ領域を60バイト程使用することになります。
ToArray関数は新たに配列を生成しているため、要素数にも依りますが、軽い処理とは言えません。使わないで良いなら極力使いたくありません。
ちなみにToArray関数は以下のような実装になっています。
public T[] ToArray()
{
T[] array = new T[this._size];
Array.Copy(this._items, 0, array, 0, this._size);
return array;
}
IListインターフェースを使用して回避
List型、Array型どちらもIListインターフェースを実装しているため、以下のようにIListを引数にしてあげることでToArrayを回避できます。
void Foo ()
{
List list = new List(){0, 1, 2, 3, 4,5, 6};
Convert(list);
}
void Convert (IList arr)
{
// Do Something....
}

こうすることでGCAllocを0にすることが出来ます。
ひとこと
最近UnityのWindows環境開発を始めてみたのですが、Visual Studio、ILSpy最高っす。

この記事が気に入ったらフォローしよう
オススメ記事