1. 程式人生 > >《.NET 進階指南》讀書筆記2------定義不可改變類型

《.NET 進階指南》讀書筆記2------定義不可改變類型

string類型 註意 pla 公開 不可變 如何 repl efs rep

不可改變對象的定義

  一個類型的對象在創建後,它的狀態就不能再改變,知道它死亡,它的狀態一直維持與創建時相同。這時候稱該對象具有不可改變性。這樣的類型為不可改變類型。
不可改變對象在創建的時候,必須完全初始化。因為創建完成後就不能再改變了。任何對不可改變對象進行的操作都會生成一個新的對象。例如String類型就是一個不可改變類型。任何對String類型實例的改變,如String.Trim()、String.Replace()都不會影響原有的String對象,這些方法都會生成一個全新的String對象。

如何定義一個不可變類型

定義一個不可改變類型時,需要註意以下三點:

  • 類型的構造方法一定要設計好,能夠充分的初始化對象,因為對象創建好後,就無法再進行改變,構造方法是唯一能夠改變對象狀態的地方;
  • 涉及改變對象狀態的方法均不能真正的改變對象的本身,而都應該返回一個全新的對象;
  • 類型的所有的公開屬性都應該是只讀的,並且註意一些引用類型雖然是只讀的,但是可以通過只讀的引用去更改堆中的實例從而更改了原對象的狀態
class ImmutableType
{
    private int _val;
    private int[] _refs;
    public int Val
    {
        get
  {
    return _val;
  }
    }
 // 對於引用類型,返回一個新的對象,防止被改變
 public int[] Refs
 {
  get
  {
   int b = new int[_refs.Length];
   for(int i = 0; i < b.Length;i++)
   {
    b[i] = _refs[i];
   }
   return b;
  }
 }
    
 //構造函數
 public ImmutableType(int val,int[] refs)
 {
  _val = val;
     _refs = new int[refs.Length];
     for(int i = 0; i < _refs.Length;i++)
     {
      _refs[i] = refs[i];
     }
 }
    
 // 對屬性進行更新時返回了一個新的對象
 public ImmutableType UpdateVal(int val)
 {
        return new ImmutableType(this._val + val,this._refs);
 }
}
class Program
{
 static void Main()
 {
     ImmutableType a = new ImmutableType(1,new int[]{1,2,3,4});
        a = a.UpdateVal(2);// 這裏返回了一個新的對象  
 }
}

《.NET 進階指南》讀書筆記2------定義不可改變類型