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