Unity、C#の知っていると便利な技術のあれやこれ。（個人用・不定期更新）

C#やUnityでプログラムを書いていく中でこれを知っていれば、更にプログラムを書くのが楽になる！
そんな技術をまとめていくよ。
</br>
</br>
</br>
私が友人などに技術共有する用につくったものなので、メモ感覚の軽い気持ちで見ていただけると嬉しいです・・・。不定期に追加予定。。。

##ジェネリック（＜T＞）

　C#が提供する複数のデータ型に対応したオブジェクト(メソッドやクラス)を定義する機能。
　まあ、簡単に言ってしまえば、初めから型を決めないで後出しで型を決めることが出来る手法。
　（ただし注意点として、**計算などには対応していない**。）

</br>
　まあ、聞こえだけ見ればとんでもなく便利なものに聞こえるが、**使うことはそこまで多くない**。
　主にオブジェクトプールのような、型がわからない場合なんかには使うことが多い印象だが、基本的に処理の中で**型の不整合**なんかが起きないように、ちゃんと型指定するほうが無難なので、通常の処理ではなかなか使うことはないんじゃないかと思う。

　だが知っておいて損はない技術でもある。(…というか結構見る機会もあるから覚えとけ！)

</br>
　使用するには、`using System.Collections.Generic`が必要！
</br>
</br>
　使う事も普段ないから、いい書き方思いつかなかったけど、こんな感じにクラスやメソッドの後ろに`<T>`とつけることで使用できる。

```ruby:generics
    public class main<T>
    {
        private List<T> list = new List<T>();

        private void Generics(T gene)
        {
            list.Add(gene);
        }
    }
```

##コンストラクタ・デストラクタ

コンストラクタはクラスを生成した際に入る処理だ。
簡単に言えば、newしてクラスを生成した際に勝手に実行される処理で、引数なども設定できるので初期値なんかを設定する際にも使えたりする。

逆にデストラクタは、クラスを破棄した際に入る処理だ。
こちらは、もう生成するクラスが使われないと判断されGCによって勝手に破棄された際、Disposeなんかを使用してクラスを破棄した際などに呼ばれる。(正直使う機会はほとんどないような気がする。)

それぞれ以下のように書く。

```C#
public class Test
{
    //コンストラクタ(クラスと同じ名前にする)
    public Test()
    {
        //new した際にやりたい処理
    }

    //デストラクタ(クラスと同じ名前にする)
    ~Test()
    {
        //Dispose した際にやりたい処理
    }
}
```

##プロパティ

プロパティは簡単に言ってしまうと、変数に処理を実装するものと考えてもらえればいい。
例えば、RPGを作る際にHPに上限値や下限値を設けたいときがあると思う。

そういった場合に以下のような処理を書くと、変数にアクセスした際に勝手に処理が入ってくれるという便利なものだ。

```C#
    //入れ物
    private int _hp = 10;
    //最大HP
    private int _maxHp = 10;
    //プロパティ（ここにアクセスして使う）
    public int HP
    {
        //変数を取得するとき
        get
        {
            //取得するときに渡す値
            return _hp;
        }
        //変数を設定するとき
        set
        {
            //入ってきた値（value）が０以下なら０に固定する。
            if (value < 0)
            {
                value = 0;
            }
            //入ってきた値（value）が最大値より大きければ最大値に固定する。
            if (value > _maxHp)
            {
                value = _maxHp;
            }

            _hp = value;
        }
    }
```
getは値を取得するときに入る処理だ。
例えばif文で比べるときなどはこちらに入る。
値は必ずreturnで返してあげなければいけない。

setは値を設定するときだ。
加減算の値を設定したいときやなどに入る。
最後にはちゃんと値を入れ物に設定してあげなければバグる。

又、set内にあるvalueは、入ってきた値だ。
HP=2;などといった処理を書いた場合は２がvalueに当たる。

>https://www.fenet.jp/infla/column/technology/c%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%9D%E3%81%86%EF%BC%81%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E5%AE%9F%E8%A3%85%E6%96%B9/

##タプル

　**名前の無い型**としてして使用できるが、後続の人が混乱しないようにわかりやすく書くように注意。
　又、**複数の戻り値**が設定できるので、非常に使い勝手はいい。
</br>
　一括管理したいときに使うので、頻繁には使わない。
　便利だからって、何でもかんでもまとめると後続の人がわかりにくいので気を付ける事。
</br>
　で、まあわかりやすく例を出すとするなら、座標XとYを一括管理したい！ってときに

```ruby:tuple
private (int X, int Y) Cell = (0, 0);
```

　と書くことによって、X座標とY座標を合体させたCellっていう変数が出来上がる。
</br>
　又、このXとYの名前は前述したとおり、書かなくてもいいし、逆にそれぞれを参照したいときには・・・

```ruby:tuple
Cell.X = 1;
Cell.Y = 2;
```

　というように書けば変更できる。
　両方に値を入れたいときは最初と同じように括弧で囲って入れてあげる。
</br>
　他にも`if文`で比べたり、結構いろんなことが出来るので、調べてみるといいかも。
>[参考サイト様]https://ufcpp.net/study/csharp/datatype/tuples/
</div></details>

##三項演算子

　基本的には可読性を向上させるために、if文を短くまとめたような物って考えてもらえればいいと思う。

```C#
//変数＝条件式？true：false
int i = flag ? 1 : -1 ;
```

　上記のコードは`flag`が`trueのときに１`、`falseのときにー１`が返ってくる。