屬性的存取器包含與取得或設定屬性有關的可執行語句。存取器聲明可以包含 get 存取器或 set 存取器,或兩者均包含。聲明採下列形式之一:
1 2 |
|
get 存取器:
get 存取器體與方法體相似。它必須傳回屬性類型的值。執行 get 存取器相當於讀取欄位的值。
以下是傳回私有欄位 name 的值的 get 存取器:
1 2 3 4 5 6 7 8 9 10 11 |
|
當引用屬性時,除非該屬性為賦值目標,否則將呼叫 get 存取器讀取該屬性的值。
例如:
1 2 3 |
|
get 存取器必須在 return 或 throw 語句中終止,且控制不能超出存取器體。
set 存取器:
set 存取器與傳回 void 的方法類似。它使用稱為 value 的隱式參數,此參數的類型是屬性的類型。
在下例中,set 存取器被加入到 Name 屬性:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
當對屬性賦值時,該操作將呼叫 set 存取器。
例如:
1 |
|
在 set 存取器中對局部變數宣告使用隱式參數名稱 (value) 是錯誤的。
備註:
屬性以下列方式,以所使用的存取器分類:
只帶有 get 存取器的屬性稱為唯讀屬性。無法對唯讀屬性賦值。
只帶有 set 存取器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標外,無法對其進行引用。
同時帶有 get 和 set 存取器的屬性為讀寫屬性。
在屬性宣告中,get 和 set 存取器都必須在屬性體的內部宣告。
使用 get 存取器來變更物件的狀態是一種錯誤的程式設計樣式。
我們透過下面的例子來認識什麼是訪問器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
很好理解,訪問器就是指對象類型成員對外界的接口,就是使對象類型成員與外界進行信息交互的橋樑,有了存取器,外界就能對物件成員進行讀取、寫入的對應操作。
那麼,什麼成員能夠擁有訪問器呢?非唯讀的欄位和事件是可以聲明存取器的。當然,唯讀域也能提供被外界取得的接口,即get,但是只能在宣告或建構函數中初始化,而且它不支援提供set方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
上述程式碼中只讀域的值在宣告時就已經賦了,而它對應公開屬性的存取器中也不能提供set方法,不然會無法透過編譯,但是它可以被外界取得。
關於字段的訪問器我們還要說一些,常見的有以下寫法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
以上示例中的只讀、只寫僅對外界有效,如果您顯示得製定了該訪問器的所有者,即類別的私有字段。那麼在類別的內部,您仍可以方便的使用您定義的私有字段進行讀寫操作,因此,我建議朋友們定義字段及其訪問器使用.NET2.0的語法而不用3.0的新語法(自動屬性)。當然,利用存取器也能更好地對資料有效性進行驗證:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|