C#中的屬性和欄位的區別

fan_rockrock發表於2014-01-25

屬性和欄位的區別和聯絡

問題:C#語法中針對類中資料成員的訪問引見的屬性和欄位概念和C++相比,C++中只要屬性(覺得相當於於C#中的欄位),但是在運用C#過程中,假入本人要寫一個類,包含幾個資料成員(即欄位)但是為了讓外邊能夠訪問還需求寫對應的屬性出來,豈不是有點費事?使用屬性的優點是什麼? 

在C#中,我們可以非常自由的、毫無限制的訪問公有欄位,但在一些場合中,我們可能希望限制只能給欄位賦值於某個範圍、或是要求欄位只能讀或只能寫,或是在改變欄位時能改變物件的其他一些狀態,這些單靠欄位是無法做到的,於是就有了屬性,屬性中包含兩個模組:set和get,set模組負責屬性的寫入工作,get模組負責屬性的讀取工作。在兩個模組中都可以做一些其他操作,如在set中驗證賦的值是否符合要求並決定是否進行賦值。當缺少其中一塊時屬性就只能讀或只能寫,set和get塊中屬性必需有一個,因為即不能讀又不能寫的屬性是沒有意義的。

class Product   //商品類

    {

        //私有欄位

        private string _Pname;   //商品名稱

        private bool _IsNoEmperty;    //是否有庫存

        private float _Price;     //商品單價

        private int _PCount;      //商品數量

        //屬性:

        //可讀寫

        public string Pname

        {

            set { _Pname = value; }

            get { return _Pname; }

        }

        //只讀

        public bool IsNoEmperty

        {

            get { return _IsNoEmperty; }

        }

        //可檢測賦值是否正確

        public float Price

        {

            set

            {

                if (value >= 0)

                    _Price = value;

                else

                    throw new Exception("Price的賦值範圍");

            }

            get

            {

                return _Price;

            }

        }

        //賦值時更改其他狀態

        public int PCount

        {

            set

            {

                _PCount = value;

                _IsNoEmperty = true;   //改變了_IsNoEmperty欄位的值

            }

            get { return _PCount; }

        }

        public void Print()

        {

            Console.WriteLine("產品資訊如下:");

            Console.WriteLine("產品名稱:{0}",_Pname);

            Console.WriteLine("產品價格:{0}", _Price);

            Console.WriteLine("庫存數量:{0}", _PCount);

Console.ReadLine();

        }

        static void Main(string[] args)

        {

            Product P1=new Product();

            P1.Pname="黑人牙膏(克)";

            P1.Price=5;

            P1.PCount=20;

            P1.Print();

        }

小結:引入屬性的優點

1.維護私有欄位(保證類的封裝性)

2.可控制訪問(只讀/只寫,確保賦值的正確性等)

3.不用注重細節(直接使用,不需要考慮複雜的處理程式碼)

至於引入屬性的益處在更多的c#程式中會領會的愈加深入

問題:什麼情況下選擇使用欄位還是屬性?

從例子中可看到屬性其實就是對私有欄位的讀取和寫入,以便做些公有欄位無法完成的任務,他的使用方式和公有欄位完全一樣,所以可以理解成屬性是為了滿足對公有欄位的特殊需求而產生的附屬品。因而當我們選擇使用屬性還是使用欄位時,主要看需求,如果不需設定訪問許可權、不需在賦值時檢測值是否滿足要求、不需要在賦值時修改物件其他一些狀態等特殊的需求時,使用公有欄位即可,否則就使用屬性。

相關文章