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#提供了兩種方式:
-
通過隱藏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訪問器來實現只寫屬性
-
通過給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進行定義的情況下,呼叫屬性是會出現編譯錯誤的,這個一定要切記。