C#2.0新增功能07 getter/setter 單獨可訪問性

  • 2019 年 10 月 4 日
  • 筆記

  屬性是一種成員,它提供靈活的機制來讀取、寫入或計算私有欄位的值。 屬性可用作公共數據成員,但它們實際上是稱為訪問器的特殊方法。 這使得可以輕鬆訪問數據,還有助於提高方法的安全性和靈活性。

屬性概述

  • 屬性允許類公開獲取和設置值的公共方法,而隱藏實現或驗證程式碼。
  • get 屬性訪問器用於返回屬性值,而 set 屬性訪問器用於分配新值。 這些訪問器可以具有不同的訪問級別。 有關詳細資訊,請參閱限制訪問器可訪問性
  • value 關鍵字用於定義由 set 訪問器分配的值。
  • 屬性可以是讀-寫屬性(既有 get 訪問器又有 set 訪問器)、只讀屬性(有 get 訪問器,但沒有 set 訪問器)或只寫訪問器(有 set 訪問器,但沒有 get 訪問器)。 只寫屬性很少出現,常用於限制對敏感數據的訪問。
  • 不需要自定義訪問器程式碼的簡單屬性可以作為表達式主體定義或自動實現的屬性來實現。

具有支援欄位的屬性

有一個實現屬性的基本模式,該模式使用私有支援欄位來設置和檢索屬性值。 get 訪問器返回私有欄位的值,set 訪問器在向私有欄位賦值之前可能會執行一些數據驗證。 這兩個訪問器還可以在存儲或返回數據之前對其執行某些轉換或計算。

下面的示例闡釋了此模式。 在此示例中,TimePeriod 類表示時間間隔。 在內部,該類將時間間隔以秒為單位存儲在名為 _seconds 的私有欄位中。 名為 Hours 的讀-寫屬性允許客戶以小時為單位指定時間間隔。 getset 訪問器都會執行小時與秒之間的必要轉換。 此外,set 訪問器還會驗證數據,如果小時數無效,則引發 ArgumentOutOfRangeException

using System;    class TimePeriod  {     private double _seconds;       public double Hours     {         get { return _seconds / 3600; }         set {               if (value < 0 || value > 24)               {                throw new ArgumentOutOfRangeException(string.Format("{0}must be between 0 and 24.",nameof(value)));               }               _seconds = value * 3600;             }     }  }    class Program  {    static void Main()    {      TimePeriod t = new TimePeriod(); // 屬性分配導致調用「set」訪問器      t.Hours = 24; // 檢索屬性會導致調用「get」訪問器。      Console.WriteLine($"Time in hours: {t.Hours}");    }  } // 輸出結果:Time in hours: 24