1. 程式人生 > >C#中的屬性-Property

C#中的屬性-Property

 

C#的屬性一直都有用,但具體瞭解的不是很深,而且一些注意事項也沒有太在意過,糊里糊塗的用著。這兩天看了C#的書專門學習了一下屬性,這才知道,原來屬性也有這麼多東西~ ~今天記錄一下,算是對學習的一個檢驗吧。 屬性的本質是方法,是欄位的封裝形式,對外界提供欄位的訪問功能,避免外界直接接觸到欄位,有點經紀人的意思。屬性包含兩個訪問器,一個是get,一個是set,通過get訪問器外界可以通過屬性獲取相應的欄位的值;通過set訪問器,外界可以傳遞值給set訪問器預設包含的變數value,來更改欄位的值。屬性的定義很簡單,如下:

  private int _num;
 public int Num{
     get
    {
         return this._num;
    }
     set
    {
         this._num = value;
    }
}

PS:為了區分欄位與屬性,欄位的命名通常以下劃線“_”開頭。 除了上面這種格式的屬性,C#還提供了一種書寫更加簡單的屬性,稱為自動屬性,自動屬性最大的特點就是省去了欄位的宣告(C#自動幫你做了),而且get和set訪問器不包含方法體,只用一個";"結尾,for example:

  public int Num
{
     get;
     set;
}

是不是簡化了不少?而且使用起來和普通的屬性一樣。 通過上述的兩種格式,外界可以對欄位進行讀寫,但是有的時候我們可能只想開放一部分功能,比如只讀或者只寫。實現屬性的只讀或者只寫,C#提供了兩種方式:

  1. 通過隱藏get或者set訪問器來實現只讀或者只寫。example:

private int  _num;
// 只讀屬性
public int Num{
   get{
       return this._num;
  }
}
// 只寫屬性
public int Num{
   set{
       this._num = value;
  }
 //自動屬性的只讀:
 public int Num{
     get;
}
}

PS:對於自動屬性而言,必須包含get訪問器,所以無法通過隱藏get訪問器來實現只寫屬性

  1. 通過給get和set訪問器新增訪問修飾符來實現屬性的只讀或者只寫。example:

private int _num;
 public int Num{
 //只寫
     private get
    {
         
    }
     set
    {
         this._num = value;
    }
}
 
 public int Num{
 //只讀
     private get
    {
         return this._num;
    }
     private set
    {
         
    }
}
 //自動屬性
 public int Num{
 //只寫
     private get;
     set;
}
 public int Num{
 //只讀
     get;
     private set;
}

note: 屬性在通過給訪問器新增訪問修飾符來實現只讀或著只寫功能時,get和set訪問器必須同時存在,而且訪問器的訪問修飾符的限制一定要大於屬性的訪問修飾符,例如:Num的訪問修飾符為Public,那訪問器的訪問修飾符限制就要比屬性的大,所以可以為private或者protected,但不可以是public。

屬性的只讀和只寫的功能實現就寫到這了,下面說一下屬性的初始化。屬性的初始化,也包含兩種方法,一種是通過建構函式,另一種則是在宣告的時候進行初始化。第一種方法,都很熟悉,和欄位的初始化一樣。這裡說一下第二種,因為我也是第一次見到這種寫法,先上程式碼:

  public int Num{get; set;} = int.MaxValue;

需要注意的是,只有自動屬性可以使用這種初始化方式,普通的屬性不可以這樣初始化。

屬性的特性內容差不多就這些了,下面說一下屬性在介面中的使用。介面中允許包含的內容有:屬性方法事件索引器,而屬性在介面中的使用,有點類似自動屬性,但是沒有訪問修飾符修飾,具體的訪問修飾符根據派生類的需求進行選擇。example:

  interface IHuman{
     int Age{get; set;}
}
 
 class Man:IHuman{
     public int Age{get; set;}
}

是不是和自動屬性很像,不同的是,介面中的屬性可以通過省略get來實現只讀屬性,而自動屬性不可以這麼做。

屬性的使用,除了介面或者類中之外,有的時候還會出現在結構體中。具體的使用都和上述一樣,但有一點需要注意:結構體可以在不使用new進行定義的情況下使用,但是上面我們已經說過了,屬性的本質是方法,所以在不是使用new進行定義的情況下,呼叫屬性是會出現編譯錯誤的,這個一定要切記。 好了,該睡覺去了。

PS:以上均是自己學習之後理解所寫,水平有限難免會出現錯誤之處,總是唯恐給閱讀到小夥伴造成誤導,所以希望能夠以質疑的態度去瀏覽,也希望小夥伴能夠批評指出,共同成長。