程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則7: 選擇恆定的原子值類型數據(4)

Effective C#原則7: 選擇恆定的原子值類型數據(4)

編輯:關於C語言

a1的值是兩者之一:它的原始位置 Anytown,或者是後來更新後的位置Ann Arbor。你再不用像前面的例子那樣,為 了修改已經存在的地址而使對象產生臨時無效狀態。這裡只有一些在構造函數執 行時才存在的臨時狀態,而在構造函數外是無法訪問內部狀態的。很快,一個新 的地址對象很快就產生了,它的值就一直固定了。這正是期望的安全性:a1要麼 是默認的原始值,要麼是新的值。如果在構造對象時發生了異常,那麼a1保持原 來的默認值不變。

(譯注:為什麼在構造時發生異常不會影響a1的值呢? 因為只要構造函數沒有正確返回,a1都只保持原來的值。因為是那是一個賦值語 句。這也就是為什麼要用構造函數來實現對象更新,而不是另外添加一個函數來 更新對象,因為就算用一個函數來更新對象,也有可能更新到一半時,發生異常 ,也會使得對象處於不正確的狀態當中。大家可以參考一下.Net裡的日期時間結 構,它就是一個典型的恆定常量例子。它沒有提供任何的對單獨年,月,日或者 星期進行修改的方法。因為單獨修改其中一個,可能導致整個日期處於不正確的 狀態:例如你把日期單獨的修改為31號,但很可能那個月沒有31號,而且星期也 可能不同。它同樣也是沒提供任何方法來同時設置所以參數,讀了條原則後就明 白為什麼了吧。參考一下DateTime結構,可以更好的理解為什麼要使用恆定類型 。注:有些書把immutable type譯為不變類型。)

為了創建一個恆定類型 ,你須要確保你的用戶沒有任何機會來修改內部狀態。值類型不支持派生類,所 以你不必定義擔心派生類來修改它的內部狀態。但你須要注意任何在恆定類型內 的可變的引用類型字段。當你為這些類型實現了構造函數後,你須要被動的把可 變的引用類型COPY一遍(譯注:被動COPY,defensive copy,文中應該是指為了 保護數據,在數據賦值時不得不進行的一個COPY,所以被認為是“防守 ”拷貝,我這裡譯為:被動拷貝,表示拷貝不是自發的,而是不得以而為 之的)。

所有這些例子,都是假設Phone是一個恆定的值類型,因為我們 只涉及到值類型的恆定性:

// Almost immutable: there are holes that would
// allow state changes.
public struct PhoneList
{
 private readonly Phone[] _phones;
  public PhoneList( Phone[] ph )
 {
  _phones = ph;
  }
 public IEnumerator Phones
 {
  get
  {
   return _phones.GetEnumerator();
  }
 }
}
Phone[] phones = new Phone[10];
// initialize phones
PhoneList pl = new PhoneList( phones );
// Modify the phone list:
// also modifIEs the internals of the (supposedly)
// immutable object.
phones[5] = Phone.GeneratePhoneNumber( );

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved