首頁  >  文章  >  类库下载  >  C# 屬性存取器

C# 屬性存取器

高洛峰
高洛峰原創
2016-10-13 16:31:511505瀏覽

屬性的存取器包含與取得或設定屬性有關的可執行語句。存取器聲明可以包含 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()); //使用了读取 输出 10                  
             Console.ReadKey();                    
         }
     }
 }

  很好理解,訪問器就是指對象類型成員對外界的接口,就是使對象類型成員與外界進行信息交互的橋樑,有了存取器,外界就能對物件成員進行讀取、寫入的對應操作。

  那麼,什麼成員能夠擁有訪問器呢?非唯讀的欄位和事件是可以聲明存取器的。當然,唯讀域也能提供被外界取得的接口,即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());  // 使用了读取   输出 10                
             Console.ReadKey();                              
         }
     }
 }

   上述程式碼中只讀域的值在宣告時就已經賦了,而它對應公開屬性的存取器中也不能提供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         
         }
     }
 }


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn