1. 程式人生 > >【C#】-屬性(Property)和欄位(Field)的區別

【C#】-屬性(Property)和欄位(Field)的區別

導讀:

     近期學習過程中發現了一些問題,我的學習只是學習,敲程式碼就是敲程式碼,沒有加入思考,也不問為什麼就直接去敲人家寫好的例子去敲,把知識都學死了,逐漸散失了思考能力,所以學習的興趣大打折扣,正如那句話—學而不思則罔,思而不學則殆,在設計模式中偶然看到了屬性和欄位,想想之前的C#中也提到過,但是從來沒有思索過為什麼有屬性和欄位?下面就來詳細說明。

【欄位】

     欄位(Field)是一種表示與物件或類關聯的變數的成員,欄位宣告用於引入一個或多個給定型別的欄位。欄位是類內部用的,private型別的變數(欄位),通常欄位寫法都是加個"_"符號,然後宣告只讀屬性,欄位用來儲存資料。

【屬性】

    屬性(Property)是另一種型別的類成員,定義屬性的目的是在於便於一些私有欄位的訪問。類提供給外部呼叫時用的可以設定或讀取一個值,屬性則是對欄位的封裝,將欄位和訪問自己欄位的方法組合在一起,提供靈活的機制來讀取、編寫或計算私有欄位的值。屬性有自己的名稱,並且包含get 訪問器和set 訪問器。

  宣告格式:

屬性修飾符  型別  屬性名 
{
   get{
     //get訪問器程式碼
    }
   set{
     //set訪問器程式碼
    }
}


   屬性分類:根據get訪問器和set訪問器是否存在,屬性可按下列規則分類。

      

那麼問題來了,既然已經有欄位用來儲存資料,為什麼還要引入屬性來對資料進行訪問,把宣告的欄位直接定義成公有的不就可以了嗎?

解答:在C#中,我們可以非常自由的、毫無限制的訪問公有欄位,但在一些場合中,我們可能希望限制只能給欄位賦於某個範圍的值、或是要求欄位只能讀或只能寫,或是在改變欄位時能改變物件的其他一些狀態,這些單靠欄位是無法做到的,於是就有了屬性,屬性中包含兩個塊:set和get,set塊負責屬性的寫入工作,get塊負責屬性的讀取工作。在兩個塊中都可以做一些其他操作,如在set中驗證賦的值是否符合要求並決定是否進行賦值。當缺少其中一塊時屬性就只能讀或只能寫,set和get塊中屬性必需有一個,因為即不能讀又不能寫的屬性是沒有意義的。總之,外部能夠訪問和修改定義為public的欄位,這麼做是違反類的安全性設計原則的,所以一般的欄位都是設為私有的,欄位的訪問便是由屬性來實現。

C#通過屬性特性讀取和寫入欄位(成員變數),而不直接直接讀取和寫入,以此來提供對類中欄位的保護。

【屬性VS欄位】

      

  

【適用情況】

      公共欄位:

           1. 允許自由讀寫

           2. 取值範圍只收資料型別約束而無其他任何特定限制;

           3. 值的變動不需要引發類中其它任何成員的相應變化;

         如果均滿足上述條件,那麼我們便可以大膽地使用公共欄位;

       屬性:

             1. 要求欄位只能讀或只能寫;

             2. 需要限定欄位的取值範圍;

             3. 在改變一個欄位的值的時候希望改變物件的其它一些狀態;

           如果滿足上述條件中的任何一個,就應該使用屬性。

 【程式碼展示】

pulic class User
{
    private string _name;//_name為欄位
    public string Name   //Name為屬性,它含有程式碼塊
     {
       get
       {
          return _name;//讀取(返回_name值)
        }
       set 
       {
          _name = value;//為_name賦值
        }
}

           User類的私有的欄位m_name可以通過公開的屬性Name對它進行讀寫操作。 通過“屬性”讀取“欄位”值時,將觸發get訪問器;通過“屬性”為“欄位”賦值,將觸發set訪問器。

【總結】

     屬性以靈活的方式實現了對私有欄位的訪問,是欄位的自然擴充套件,一個屬性總是與某個欄位相關聯,欄位能幹的,屬性一定能幹,屬性能幹的,欄位不一定乾的了;為了實現對欄位的封裝,保證欄位的安全性,產生了屬性,其本質是方法,暴露在外,可以對私有欄位進行讀寫,以此提供對類中欄位的保護,欄位中儲存資料更安全。
  

尾言:

      無論是屬性還是欄位都有它存在的意義,需求多種多樣,就產生多種多樣的對策,屬性和欄位算是C#中的基礎知識,掌握好基礎知識,建造的高樓大廈才更好的紮實穩固。

     如有需完善之處,敬請指出  微笑