嗨嗨~大家安安
今天呢要來說說屬性這個東東,那首先我們要如何建立屬性呢?
建立屬性的方式大致上能分兩種:
那如何用public變數建立物件屬性?我直接上範例在類別中宣告public變數。如定義類別名稱為car,此類別內含一個整數資料型別的變數speed,在變數加上public變成公用變數,這樣car就有一個屬性了。
namespace project
{
class car
{
public int speed;
}
internal class Program
{
static void Main(string[] args)
{
car car = new car();
car.speed = 100;
Console.WriteLine("Car的speed={0}",car.speed);
}
}
}
直接在class中宣告public變數雖然是建立屬性最快的方法,但對於這類型屬性存取並無法做任何額外控制,例如我們要為car類別上一個能夠限制在0~200的speed屬性,若採用public變數會發現,speed屬性值可以隨便設,設成負的也行,是其缺點,所以如果希望對於屬性的存取都能做一些額外的處理時,如控制屬性值的範圍,就必須使用方法或存取子敘述來定義屬性。
若希望對於屬性的存取都能做一些範圍控制,使具有物件封裝特性,可將speed屬性由public改成private,以_speed代替speed,用來存取speed的值,由於_speed是private,因此car上不能使用_speed做為屬性,下面我們來修改一下範例,讓Car的speed屬性能控制在0~200的範圍內
namespace project
{
class car
{
private int _speed;
public int getspeed()
{
return _speed;
}
public void setspeed(int speed)
{
if (speed < 0)
_speed = 0;
else if (speed > 200)
_speed = 200;
else
_speed = speed;
}
}
internal class Program
{
static void Main(string[] args)
{
car car = new car();
car.setspeed(300);
Console.WriteLine("Car的speed={0}",car.getspeed);
}
}
}
可是這有一個小缺點,那就是在設定屬性時必須用呼叫方法加參數,而不能直接指定屬性值得方法,但C#提供get跟set存取子敘述來定義屬性,改寫程式如下:
namespace project
{
class car
{
private int _speed;
public int speed
{
get
{
return _speed;
}
set
{
if (value < 0)
_speed = 0;
else if (value > 200)
_speed = 200;
else
_speed = value;
}
}
}
internal class Program
{
static void Main(string[] args)
{
car car = new car();
car.speed = 300;
Console.WriteLine("Car的speed={0}",car.speed);
}
}
}
那接下來我們要如何建立唯讀(ReadOnly)或唯寫(WriteOnly)屬性呢?很簡單~~
當要唯讀時,屬性定義裡只出現get{...}不能出現set{...},反之,當要唯寫時就只能有set{...}不能有get{...},是不是很簡單啊~~~
最後,在類別內使用get跟set來定義屬性最大的優點就是可以隱藏實作和驗證程式碼,以達物件導向資料封裝,另外使用get跟set來定義,該屬性即可與控制項屬性進行資料繫結。若使用public公用變數當作類別屬性,就無法達到資料封裝,且該屬性也無法和控制項屬性進行資料繫結,所以建議將public公用變數改使用public公用屬性來表示。
在Visual C# 2005之前若是將所有public公用變數全改成屬性來表示將會是大工程。且像學生姓名這種單純字串的變數並不用進行資料封裝。若改用屬性表示,要先建立私有變數存放學生姓名內容,再透過get跟set來存取,是如次的麻煩,下面看範例:
class Student
{
private string _ID, _name;
public string ID
{
get { return _ID; }
set { _ID = value; }
}
public string name
{
get{ return _name; }
set { name = value; }
}
}
由Visual C# 2008開始提供自動屬性實作,讓屬性定義更明確,且使用get跟set定義屬性不需要重複宣告,上面範例可改成下面寫法,看起來更加精簡
class Student
{
public string ID { get; set; }
public string Name { get; set; }
}
好啦,今天講的非常的多,就先到這邊告一段落啦~
大家掰掰