今回も小ネタです。
時々以下のようなコードに出会います。
void Foo () { List<int> list = new List<int>(){0, 1, 2, 3, 4,5, 6}; Convert(list.ToArray()); } void Convert (int[] arr) { // Do Something.... }
一見問題なさそうなのですが、ToArray
関数をわざわざ呼んでいるのが気になります。
このようにヒープ領域を60バイト程使用することになります。
※要素数によってこの値は増減します
ToArray関数は新たに配列を生成しているため、要素数にも依りますが、軽い処理とは言えません。使わないで良いなら極力使いたくありません。
※ToList関数も同様です
ちなみに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<int> list = new List<int>(){0, 1, 2, 3, 4,5, 6}; Convert(list); } void Convert (IList<int> arr) { // Do Something.... }
こうすることでGCAllocを0にすることが出来ます。
ひとこと
最近UnityのWindows環境開発を始めてみたのですが、Visual Studio、ILSpy最高っす。