c#屬性的訪問器get_set操作成員變量


c#屬性的訪問器get_set操作成員變量

《C#》 C#高級編程  第11版 2019.pdf.. Q_group:34943064

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

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

復制代碼
private string name;  // the name field
public 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的新語法(自動屬性)。當然,利用訪問器也能更好地對數據有效性進行驗證:

 

//namespace standard_agv_test
namespace 服務器_window_
{
    public class Station
    {
        
         public string Name { get; }//定義的好處在於,雖然是public,但不能直接賦值,只能通過Station操作。
       
        public int Id { get; }

        public Station(string name, int id)
        {
            this.Name = name;
            this.Id = id;
        }

        public override string ToString()
        {
            return $"name is {Name},id is {Id}";
        }
    }
}

 

復制代碼
 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
         }
     }
 }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM