屬性、屬性的=>寫法

屬性是代表類的實例或類中的一個數據項成員,使用屬性看起來像寫入或讀取一個字段,屬性是指定的一組倆個匹配的、稱爲訪問器的方法,set訪問器爲屬性賦值,get訪問器從屬性獲取值。並且,除了這倆個訪問器外,在屬性上不允許有其他方法。

屬性與字段的區別

(1)屬性是一個函數成員,允許處理輸入和輸出,而字段不行
(2)它不爲數據存儲分配內存
(3)它執行代碼
(4)屬性可以只讀或只寫,字段則不行
(5)編譯後的變量和編譯後的屬性語義不同

屬性的訪問器

set訪問器:擁有一個單獨的、隱式的值參,名稱爲value,與屬性的類型相同,返回類型爲void

get訪問器:沒有參數,返回類型與屬性類型相同

屬性的底層實現

屬性的底層實現是由一個字段和倆個函數實現的,下面代碼展示了一個名稱爲C1的類地聲明示例,它含有一個名稱爲MyValue的屬性,注意,屬性本身沒有任何存儲,訪問器決定如何處理發進來的數據,以及聲明數據應被髮送出去,這裏屬性隱含使用一個名爲TheRealValue的字段作爲存儲,和屬性關聯的字段常被稱爲後備字段或後備存儲,set訪問器接受它的輸入參數value,並把它賦值給字段TheRealValue,get訪問器只是返回字段TheRealValue的值。所以當我們使用屬性的默認書寫方法時,系統會自動未我們實現這種結構,當然我們也可以進行屬性的自定義寫法,也就是在訪問器中進行一些額外的操作

  class C1
    {
        private int TheRealValue;    //字段:內存分配
        public int MyValue     //屬性:未分配內存
        {
            set
            {
                TheRealValue = value;
            }
            get
            {
                return TheRealValue;
            }
        }
    }

自動實現屬性

因爲屬性經常被關聯到後備字段,C#提供了自動實現屬性,允許只聲明屬性而不聲明後備字段,編譯器會爲你創建隱藏的後備字段,並且自動掛接到get和set訪問器上。

實現寫法:
(1)不聲明後備字段,編譯器會根據屬性的類型分配存儲
(2)不能提供訪問器的方法體,它們必須被簡單的聲明爲分號,get擔當簡單的內存讀,set擔當簡單的寫
(3)除非通過訪問器,否則不能訪問後備字段,因爲不能用其他的方法訪問它,所以實現只讀和只寫屬性沒有意義,因此必須同時提供讀寫訪問器

屬性的初始化

在3.5以下的版本如果要想對類中的屬性初始化,只能通過定義帶參構造函數進行初始化,如果在3.5以上的版本可以直接進行初始化。

    class Program
    {
        static public int i { get; set; } = 10;
        static void Main(string[] args)
        {
            Console.WriteLine(Program.i); //10
        }
    }

屬性的只讀和只寫

要想不定義屬性的某個訪問器,可以忽略該訪問器的聲明,只有get的訪問器爲只讀屬性,只有set的訪問器爲只寫屬性,倆個訪問器中至少有一個必須定義,否則編譯器會產生一條錯誤信息,這只限於自定義屬性的情況下,在自動實現的屬性中,不能存在只含有set訪問器的情況

Lambda符號=>定義只讀屬性

lambda符號=>還有一種與屬性相關的用法,就是他可以用來定義只讀屬性(只有get)。

public class A
    {
        private string aa;
        public string a
        {
            get
            {
                return aa;
            }
        }
    }

    public class A
    {
        private string aa;
        public string a
        {
            get => aa;
        }
    }

    public class A
    {
        private string aa;
        public string a => aa;  //定義只讀屬性a,該屬性的值爲aa
    }

屬性的使用(讀寫)

屬性的讀寫和字段是一樣的,直接訪問即可,訪問器只是被隱式調用,屬性會根據是寫入還是讀取,來隱式的調用適當的訪問器,不能顯示地調用訪問器,這樣做會產生編譯錯誤

    class C1
    {
        private int TheRealValue;    //字段:內存分配
        public int MyValue     //屬性:未分配內存
        {
            set
            {
                TheRealValue = value;
            }
            get
            {
                return TheRealValue;
            }
        }
        static void Main(string[] args)
        {
            C1 c = new C1();
            c.MyValue = 10;       //賦值:隱式調用set方法
            int i = c.MyValue;    //獲取:隱式調用get方法
            //MyValue.set(10);  編譯錯誤
            //MyValue.get();    編譯錯誤
        }
    }

靜態屬性

屬性也可以聲明爲static,靜態屬性的訪問器和所有靜態成員一樣,有以下特點:
(1)不能訪問類的實例成員,雖然它們能被實例成員訪問
(2)不管類是否有實例,它們都是存在的
(3)當從類的外部訪問時,必須使用類名引用,而不是實例名

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章