摘要:物件導向系列菜單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 {return 10 ;} }
}
試試看寫入值的話,則有人會打斷你的腿。
public Form1()
{
InitializeComponent();
//實體化Test類別成test物件。
Test test = new Test();
//將10寫入PeopleNumber,會出錯喔
test.PeopleNumber = 10;
}
它只能讀而以~
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);
}
執行結果
待續~~~
參考資料