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

C# 屬性存取器

高洛峰
發布: 2016-10-13 16:31:51
原創
1635 人瀏覽過

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

1

2

get {}

set {}

登入後複製

get 存取器:
get 存取器體與方法體相似。它必須傳回屬性類型的值。執行 get 存取器相當於讀取欄位的值。

以下是傳回私有欄位 name 的值的 get 存取器:

1

2

3

4

5

6

7

8

9

10

11

private string name;  // the name field

  

public string Name  // the Name

  

property

{   

   get

   {      

       return name;

   }

}

登入後複製

當引用屬性時,除非該屬性為賦值目標,否則將呼叫 get 存取器讀取該屬性的值。

例如:

1

2

3

Employee e1 = new Employee();

 ...

 Console.Write(e1.Name); // The get accessor is invoked here

登入後複製

get 存取器必須在 return 或 throw 語句中終止,且控制不能超出存取器體。



set 存取器:
set 存取器與傳回 void 的方法類似。它使用稱為 value 的隱式參數,此參數的類型是屬性的類型。

在下例中,set 存取器被加入到 Name 屬性:

1

2

3

4

5

6

7

8

9

10

11

12

public string Name

   get

   

        return name;

   

      

   set

   {

       name = value;

   }

}

登入後複製

當對屬性賦值時,該操作將呼叫 set 存取器。

例如:

1

e1.Name = "Joe"; // The set accessor is invoked here

登入後複製

在 set 存取器中對局部變數宣告使用隱式參數名稱 (value) 是錯誤的。


備註:

   屬性以下列方式,以所使用的存取器分類:
   只帶有 get 存取器的屬性稱為唯讀屬性。無法對唯讀屬性賦值。
   只帶有 set 存取器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標外,無法對其進行引用。
   同時帶有 get 和 set 存取器的屬性為讀寫屬性。
   在屬性宣告中,get 和 set 存取器都必須在屬性體的內部宣告。
   使用 get 存取器來變更物件的狀態是一種錯誤的程式設計樣式。


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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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方法,不然會無法透過編譯,但是它可以被外界取得。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

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的新語法(自動屬性)。當然,利用存取器也能更好地對資料有效性進行驗證:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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        

         }

     }

 }

登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板