1. 程式人生 > >C#語言中欄位和屬性相關知識剖析

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