こんにちは、Unityエンジニアのオオバです。

今回も小ネタです。
時々以下のようなコードに出会います。

void Foo ()  
{
    List list = new List(){0, 1, 2, 3, 4,5, 6};  
    Convert(list.ToArray());  
}

void Convert (int[] arr)  
{
    // Do Something....  
}

一見問題なさそうなのですが、ToArray関数をわざわざ呼んでいるのが気になります。

ToArray、ToListを呼ばない工夫をする_0

このようにヒープ領域を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....  
}

ToArray、ToListを呼ばない工夫をする_1

こうすることでGCAllocを0にすることが出来ます。

ひとこと

最近UnityのWindows環境開発を始めてみたのですが、Visual Studio、ILSpy最高っす。

オススメ記事