物件導向系列菜單 8-『 屬性 ( Properties ) 與欄位 ( Field ) 和存取子 ( accessor ) 』
c井字號 物件導向
Lastmod: 2019-12-11

區別何謂屬性與何謂欄位

先來說說欄位,欄位(Field)是一個任意型別(Type)的變數,直接在類別(Class)與結構(struct)中宣告。(註: 型別(Type)就是Int 、bool這些在變數前的東東)

	public class Car
    {
        //這個就是欄位(Field)
        private int PeopleNumber;

    }

而屬性呢?,屬性(Properties)是欄位和方法的綜合體,也是直接在類別(Class)與結構(struct)中宣告,它可以提供完整的控制,你可以控制它為只能讀或寫,有時會與private 欄位(Filed)一起使用,怎麼控制呢,這就需要介紹存取子(accessor)。

	public class Car
    {
          //這個就是屬性
        public int PeopleNumber { get; set;}

    }

存取子 ( accessor )

屬性的存取子包含讀取 ( Get )和 寫入 ( Set )。

Get存取子

get存取子可以用於傳回欄位值或計算它並且回傳。

下列程式碼為Test 類別,有公開屬性PeopleNumber,設定為『只能讀』,但寫成降出錯喔,因為一定要有初始值。

	class Test
    {
       public int PeopleNumber { get ;}
    }

要改成下列程式碼,才正確。

	class Test
    {
        //設定唯時一定要給它值。不然會出錯。
        public int PeopleNumber { get {return 10 ;} }
    }

試試看寫入值的話,則有人會打斷你的腿。

  	public Form1()
        {
            InitializeComponent();
            //實體化Test類別成test物件。
            Test test = new Test();
           
            //將10寫入PeopleNumber,會出錯喔
            test.PeopleNumber = 10;
        }

它只能讀而以 ~

	 public Form1()
        {
            InitializeComponent();
            //實體化Test類別成test物件。
            Test test = new Test();
           
            //將10寫入PeopleNumber,會出錯喔
            //test.PeopleNumber = 10;

            //它只能給我們讀取。
            Console.WriteLine("PeopleNumber屬性為:" + test.PeopleNumber);
        }



	PeopleNumber屬性為:10

Set存取子

可以用於將某欄位設定值。

在下列程式碼Test類別,有一屬性PeopleNumber,設為『只能寫入』,和peopleNumber欄位。

 	class Test
    {
       
        private int peopleNumber;
     //設定只能寫。
        public int PeopleNumber {
           set {
               //將peopleNumber欄位設定值。
               peopleNumber = value;

               //只是輸出給你看people欄位值為多少。
               Console.WriteLine("peopleNumber欄位值為" + peopleNumber);
           }
       
        }

    }

 	public Form1()
        {
            InitializeComponent();
            //實體化Test類別成test物件。
            Test test = new Test();
           
            //將10寫入PeopleNumber。
            test.PeopleNumber = 10;
          
            //它只能給我們寫入所以這會出錯。
           // Console.WriteLine("PeopleNumber屬性為:" + test.PeopleNumber);
        }



	PeopleNumber屬性為:10

嘗試讀取看看,會出錯喔。所以要把寫的那行刪掉才可以執行。

	 public Form1()
        {
            InitializeComponent();
            //實體化Test類別成test物件。
            Test test = new Test();
           
            //將10寫入PeopleNumber。
            test.PeopleNumber = 10;
          
            //它只能給我們寫入所以這會出錯。
            Console.WriteLine("PeopleNumber屬性為:" + test.PeopleNumber);
        }

Get 與 Set 一起使用

在封裝概念中,通常私有欄位會與公開屬性塔配使用,原因在下篇封裝文章中說明。

 	class Test
    {
       
        //宣告私有peopleNumber欄位
        private int peopleNumber;
        public int PeopleNumber {
           set {
               //將peopleNumber欄位設定值。
               //在這裡peopleNumber叫『支援欄位(Backing Field)』
               peopleNumber = value;

               //只是輸出給你看people欄位值為多少。
               //這裡就不需要輸出給你看了,因為有Get了。
               //Console.WriteLine("peopleNumber欄位值為" + peopleNumber);
           }

            get
            {
                //回傳peopleNumber欄位值,你也可以在這進行計算 例如乘10或打折之類的。
                return peopleNumber;
            }
       
        }

    }


	 public Form1()
        {
            InitializeComponent();
            //實體化Test類別成test物件。
            Test test = new Test();
           
            //將10寫入PeopleNumber。
            test.PeopleNumber = 10;
          
            Console.WriteLine("PeopleNumber屬性為:" + test.PeopleNumber);
        }




	PeopleNumber屬性為:10

參考資料

comments powered by Disqus