のにっき

クラス配列作成時に要素がnullになるのを防ぐ方法

最近、Listばっかり野郎から、配列も使ってやろうに変化したのですが、

クラス型の配列を作成した時の問題と対応をまとめておきます。

配列定義時の中身が・・・

適当なクラスの配列を作成してみます。

        // 適当クラス
        public class TestClass
        {
            public int _Id = 0;
            public string _Name = "";
        }
        // 起動時イベント
        void Start()
        {
            TestClass[] a_TestClass;
            a_TestClass= new TestClass[10];
            // ↓↓変数に値を設定しようとするとエラーになる↓↓
            a_TestClass[0]._Id = 1;
        }

こんな感じでクラス配列を作成した後、
要素のクラスに変数を設定しようとするとエラーになるはずです。
この理由は、
「クラス型の配列作成時、要素は全てnullになっている!」からです。
なので、すべての要素にインスタンスを作成する処理

    a_TestClass[0]= new TestClass();

この処理を行わないと変数の設定ができません。。。

LINQをつかって一気にやってしまおう!

インスタンス作成処理をfor文で回してもいいのですが、
ただの配列作成処理なんだからスッキリさせたいです。
こんな時に重宝するのがLINQです。
配列作成の処理にSelect文をつかって1行で完結させましょう

        // 起動時イベント
        void Start()
        {
            TestClass[] a_TestClass;
            a_TestClass= new TestClass[10].Select(x => { return new TestClass(); }).ToArray();
            // ↓↓エラーにならない!↓↓
            a_TestClass[0]._Id = 1;
        }

こんな感じで配列作成と要素にインスタンス作成の処理を1行でできます。

配列を使うメリットって何だろう?

最近、なんとなくですがListの必要がないものは
なるべく配列で組み込むようにしているのですが、
まぁまぁ良かったことをまとめときます

◆ 良かったこと

  • 配列は作成した瞬間から要素が出来ているので、一時的にクラスを作る必要がない
  • 高さが変動しないので、範囲外系のエラー時の原因追及がしやすい
  • ToLinq、ToArrayがあるのでそこまで自由度が低くなることはそんなにない
  • 「高さが変わらないなら配列」という明確なルールを持ってListと使い分けることで、型を見ただけで自分の意図が分かるからコードを読み返すときに楽

以上です
今更ですが配列は配列できっちりしていて好きになりました。