変数や引数は、基本的に不変(イミュータブル)にする

インスタンス変数、プロパティや、メソッドの引数は、一度値をセットしたら

 変更すべきではない。(引数の場合は、呼び出し元から渡された値

 を変えるべきではない。

 副作用を防ぐ為。

 

■readonly

 readonly修飾子をつけ定義した変数は、コストラクタでのみ

 値セットが可能になる。=値の変更が不可となる。

 

■値を変えたい場合

 変数の値を変えるのではなく、新たにそのクラスのインスタンスを生成し、

 それに対して新たな値をセットし返す設計がよい。 

 

 

    public class Goods
    {
        private readonly string _goodsName;
        private readonly int _goodsAmount;
        public  Goods(string goodsName,int goodsAmount)
        {
            this._goodsName = goodsName;
            this._goodsAmount = goodsAmount;
        }
        
        public  Goods AddAmount(Goods tmpGoods )
        {
            // これは悪い例
            /// _goodsAmount += tmpGoods.goodsAmount
             
            // 新たにインスタンスを生成し、それに更新後の値をセットし返す
            // 引数の型も、プリミティブ型(intとかstringとかデフォルトである型)ではなく、できるだけスコープを絞った型を
            // 渡すことで、変な値を渡してしまうということを防ぐことができる。
            return new Goods(tmpGoods._goodsName, tmpGoods._goodsAmount);
        }
    }