首頁 类库下载 C#類別庫 C# 屬性存取器

C# 屬性存取器

Oct 13, 2016 pm 04:31 PM

屬性的存取器包含與取得或設定屬性有關的可執行語句。存取器聲明可以包含 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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)