物件導向系列菜單8-『屬性(Properties)與欄位(Field)和存取子(accessor)』

摘要:物件導向系列菜單8-『屬性(Properties)與欄位(Field)和存取子(accessor)』

小弟不才,我之前真的以為欄位和屬性是相同東西,但沒想到,某些一直
以為是屬性的東西原來是欄位,一直在用的東西明明是欄位卻一直以為是屬性。
天啊~~~~~。
 
不過,人要面對現實才會成長。所有我決定把小弟的不才,和天下人說,請來笑我!。
 
某人日:
不要一直自認為是帥哥,當你面對現實你是阿宅時,
你才有機會進化為帥哥~,UnderStand !?~
 

 

正文開始

本文主題
『區別何謂『屬性(Properties)』與何謂『欄位(Field)』
『存取子(Accessor)』
 

 
『區別何謂『屬性』與何謂『欄位』』
先來說說欄位,欄位(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);
        }

 

執行結果
 
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);
        }
執行結果
 
嘗試讀取看看,會出錯喔。所以要把寫的那行刪掉才可以執行。
 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);
        }
執行結果
 
待續~~~

 

 

 



小弟才書學淺~請各位客官指教指教~~~

小弟日 : 你要知道自已不是帥哥,你才有可能變成帥哥 。