C#語言中欄位和屬性相關知識剖析
針對C#中的欄位和屬性,很多初學者無法區分這兩者之間的區別。
欄位與屬性比較
欄位;是一種“成員變數”,一般在類的內部做資料互動使用,佔用記憶體空間。
屬性:a.是一種邏輯變數,一般跟欄位一起結合起來使用,是欄位的擴充套件,並不佔用實際的記憶體。
b.屬性其實就是外界訪問私有欄位的入口,屬性本身不儲存任何資料。在面向物件設計中主要使用屬性描述物件的靜態特徵。
c.屬性設定過程中一般會用到get和set兩個方法。可以在方法里加入邏輯處理資料,靈活拓展使用。
標註:因為屬性不佔用實際記憶體,所以屬性不能用於方法的ref型別引數
下面舉個栗子,如下所示
public Class Student
{
private DateTime _Birthday;
private string _Name;
public string Name
{
get{return _Name;}
set {this._Name=value;}
}
public int Age
{
get {return DateTime.Now.Year-this._Birthday.Year}
}
}
在這個例子中,_Name是欄位,而Name為屬性,Name屬性的get方法為返回學生的姓名,Set方法則是對_Name欄位進行賦值。
Age也是類中的一個屬性,只不過這個屬性是隻讀屬性,get方法返回格式化之後的年齡資料,這就是使用屬性很好的控制了返回資料的格式,不然還得專門寫個方法去格式化資料。
同時,屬性也可以通過相應的條件對欄位賦值進行相應的限制,比如我們要限定Student的名字長度最長不能超過5個字,超過5個字的,我們就只擷取前面5個字元即可。
為了實現這種效果,我們可以在set方法內做邏輯規則運算,即可輕鬆實現想要的效果,如下所示,設定Name屬性為:
Public string Name
{
get {return _Name}
set
{
if(value.Length>5)
this._Name=value.Substring(0,5);
else
this._Name=value;
}
}
直接對欄位賦值是無法達到上述效果,你需要在每次給欄位賦值的時候,呼叫函式獲取理想值。使用屬性可以完美避免非法資料。
使用屬性的情況:
- 要求欄位只能讀或者只能寫;
- 需要限制欄位的取值範圍;
- 在改變一個欄位的值的時候希望改變物件的其它一些狀態;
使用欄位的情況:
- 允許自由讀寫;
- 取值範圍只受資料型別約束而無其他任何特定限制;
- 值的變動不需要引發類中其它任何成員的相應變化。
最後,附上我的ASP.NET學習群,歡迎各位同行入群指導交流。技術群:【ASP.NET技術社群】872894940