C#訪問器

來源:互聯網
上載者:User

標籤:

屬性的訪問器包含與擷取或設定屬性有關的可執行語句。訪問器聲明可以包含 get 訪問器或 set 訪問器,或者兩者均包含。聲明採用下列形式之一:
get {}
set {}

get 訪問器
get 訪問器體與方法體相似。它必須返回屬性類型的值。執行 get 訪問器相當於讀取欄位的值。以下是返回私人欄位 name 的值的 get 訪問器:

private string name;  // the name fieldpublic string Name  // the Name property{    get   {       return name;   }}

當引用屬性時,除非該屬性為賦值目標,否則將調用 get 訪問器讀取該屬性的值。例如:

  Employee e1 = new Employee();
  ...
  Console.Write(e1.Name); // The get accessor is invoked here
get 訪問器必須在 return 或 throw 語句中終止,並且控制不能超出訪問器體。

set 訪問器
set 訪問器與返回 void 的方法類似。它使用稱為 value 的隱式參數,此參數的類型是屬性的類型。在下例中,set 訪問器被添加到 Name 屬性:

public string Name{   get   {       return name;   }   set   {       name = value;   }}

當對屬性賦值時,該操作將調用 set 訪問器。例如:

e1.Name = "Joe"; // The set accessor is invoked here
在 set 訪問器中對局部變數聲明使用隱式參數名 (value) 是錯誤的。

備忘
屬性按如下方式,根據所使用的訪問器進行分類:
只帶有 get 訪問器的屬性稱為唯讀屬性。無法對唯讀屬性賦值。
只帶有 set 訪問器的屬性稱為唯寫屬性。唯寫屬性除作為賦值的目標外,無法對其進行引用。
同時帶有 get 和 set 訪問器的屬性為讀寫屬性。
在屬性聲明中,get 和 set 訪問器都必須在屬性體的內部聲明。
使用 get 訪問器更改對象的狀態是一種錯誤的編程樣式。

====

我們通過下面的例子來認識什麼是訪問器:

 using System;  namespace AccessorEG {     public class Student     {         // 私人欄位 private field         private int _age;          // 公開的屬性 public property         public int Age         {             get { return _age; }             set { _age = value; }         }     }      class Program     {         static void Main(string[] args)         {             Student stu = new Student();             stu.Age = 10;   // 使用了修改             Console.WriteLine(stu.Age.ToString());  // 使用了讀取             Console.ReadKey();             // 輸出 10         }     } }

 

  很好理解,訪問器就是指物件類型成員對外界的借口,就是使物件類型成員與外界進行資訊互動的橋樑,有了訪問器,外界就能對對象成員進行讀、寫的對應操作。

  那麼,什麼成員能夠擁有訪問器呢?非唯讀欄位和事件是可以聲明訪問器的。當然,唯讀域也能提供被外界擷取的借口,即get,但是只能在聲明或建構函式中初始化,而且它並不支援提供set方法,除了將其對象替換,我實在找不出更改它的辦法。

 using System;  namespace AccessorEG {     public class Student     {         // 私人欄位 private field         private readonly int _age = 10;          // 公開的屬性 public property         public int Age         {             get { return _age; }         }     }      class Program     {         static void Main(string[] args)         {             Student stu = new Student();             Console.WriteLine(stu.Age.ToString());  // 使用了讀取             Console.ReadKey();             // 輸出 10         }     } }

 

  上述代碼中唯讀域的值在聲明時就已經賦了,而它對應公開屬性的訪問器中也不能提供set方法,不然會無法通過編譯,但是它可以被外界取得。

  關於欄位的訪問器我們還要說一些,常見的有以下寫法:

using System;  namespace AccessorEG {     public class Student     {         #region 全存取權限         // 私人欄位         private int _age;         // 與_age對應的公開屬性,包含了set和get方法         public int Age         {             get { return _age; }             set { _age = value; }         }          // 如果您安裝了.NET3.0,那麼您可以使用自動屬性,屆時,上面的代碼即可以下面的代替      // 在VS.NET下輸入 prop 連擊兩下Tab鍵,編譯器會自動幫您產生自動屬性      // public int Age { get; set; }         #endregion // 全存取權限          #region 唯讀屬性         private string _name;          public string Name         {             get { return _name; }         }          // 等同於      // public string Name { private set; get; }         #endregion          #region 唯寫屬性         private bool _sex;          public bool Sex         {             set { _sex = value; }         }         // 等同於      // public bool Sex { set; private get; }         #endregion      }      class Program     {         static void Main(string[] args)         {             Student stu = new Student();             stu.Age = 18;             // stu.Name = "Johness"; 異常,編譯錯誤,因為該屬性唯讀         // Console.WriteLine(stu.Sex.ToString());   異常,編譯錯誤,因為該屬性唯寫             Console.WriteLine(stu.Age.ToString());  // 使用了讀取             Console.ReadKey();             // 輸出 18         }     } }

 

  以上樣本中的唯讀、唯寫僅對外界有效,如果您顯示得制定了該訪問器的所有者,即類的私人欄位。那麼在類的內部,您仍可以方便的使用您定義的私人欄位進行讀寫操作,因此,我建議朋友們定義欄位及其訪問器使用.NET2.0的文法而不用3.0的新文法(自動屬性)。當然,利用訪問器也能更好地對資料有效性進行驗證:

 using System;  namespace AccessorEG {     public class Student     {         // 私人欄位         private int _age;         // 與_age對應的公開屬性,包含了set和get方法         public int Age         {             get { return _age; }             // 利用訪問器對輸入的年齡進行驗證         // 如果輸入值小於0或者大於100        // 可以賦為預設值18或者不進行操作             set              {                 if (value >= 0 && value <= 100)                     _age = value;                     // 如果資料無效不進行操作可以注釋以下內容                 else                     _age = 18;             }         }      }      class Program     {         static void Main(string[] args)         {             Student stu = new Student();             stu.Age = -2;   // 賦無效值             Console.WriteLine(stu.Age.ToString());              Console.ReadKey();             // 輸出 18         }     } }

 

C#訪問器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.