はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】 IReadOnlyCollection<T>を使って読み取り専用のコレクションを作る

はじめに

今回は読み取り専用のコレクションをIReadOnlyCollection<T>インターフェイスを用いて実現する方法に関する記事になります。

これはメソッドの引数にて用いて、このメソッドは要素を変更しないという意思表示に適していると思います。

その前に

・・・といっても「コレクションってなんやねん」「インターフェイスってUIのこと?」「IReadOnlyCollectionの右に謎の象形文字がついてるんだけど」という感想を持つ人も多いかもしれません。

軽く説明する前に紹介しておきたいと思います。

コレクション

コレクションと聞いて「フィギュアなどをたくさん集めたもの」を連想した人もいるのではないでしょうか?
私は最初にそれしか思いつかなかったのですが、意外と近いといえるかもしれません。

コレクションは数字や文字列などのデータの集まり(System.Collections.Generic 名前空間以下にコレクションクラス)のことを表します。

身近なものとしてリストやディクショナリなどがコレクションの例として挙げられます。

「フィギュアというオブジェクト」の集まりだと思えば最初の考え方は正解といえるかもしれませんね。

インターフェイス

インターフェイス機能の実装を強制する仕組みのことです。
よければ以下の記事を参照してみてください!

hanaachiru.hatenablog.com

ジェネリック

なぞの<T>はジェネリックの表記を表しています。
これによって初めから型を決めておかないで、後から型をこちらから指定することが可能になります。

簡単な例だと、リストのインスタンスを作るときにList<int>とすることができるっといった感じです。

IReadOnlyCollection<T>

名前の通り、コレクション内の要素が ReadOnly となり、 Add や Clear 、インデックスによる要素アクセスといった要素を変更するメソッドが提供されなくなります
これによって読み取り専用を実現するというわけです。

またリストや配列といったコレクションはIReadOnlyCollection<T>インターフェイスを実装しています。
つまりリストや配列ならば利用することができるという意味ですね。

ちなみにIReadOnlyDictionary<TKey, TValue>IReadOnlyList<T>も存在するようです。

実際に用いた例

using UnityEngine;
using System.Collections.Generic;

public class Hoge: MonoBehaviour
{
    private void Start()
    {
        var list = new List<int> { 1, 2, 3, 4, 5 };
        Fuga(list);
    }

    private void Fuga(IReadOnlyList<int> list)
    {
        foreach(int num in list)
        {
            Debug.Log(num);
        }
    }
}

Fugaメソッド内でlistの要素を書き換えようとするとエラーになります。

さいごに

これで読み取り専用のコレクションを作成することができました。
やや使いどころは限られるような気がしますが、ぜひ使ってみてください!