問題:C#語法中針對類中數據成員的訪問引見的屬性和字段概念和C++相比,C++中只要屬性(覺得相當於於C#中的字段),但是在運用C#過程中,假入本人要寫一個類,包含幾個數據成員(即字段)但是為了讓外邊能夠訪問還需求寫對應的屬性出來,豈不是有點費事?使用屬性的優點是什么?
在C#中,我們可以非常自由的、毫無限制的訪問公有字段,但在一些場合中,我們可能希望限制只能給字段賦值於某個范圍、或是要求字段只能讀或只能寫,或是在改變字段時能改變對象的其他一些狀態,這些單靠字段是無法做到的,於是就有了屬性,屬性中包含兩個模塊:set和get,set模塊負責屬性的寫入工作,get模塊負責屬性的讀取工作。在兩個模塊中都可以做一些其他操作,如在set中驗證賦的值是否符合要求並決定是否進行賦值。當缺少其中一塊時屬性就只能讀或只能寫,set和get塊中屬性必需有一個,因為即不能讀又不能寫的屬性是沒有意義的。
class Product //商品類
{
//私有字段
private string _Pname; //商品名稱
private bool _IsNoEmperty; //是否有庫存
private float _Price; //商品單價
private int _PCount; //商品數量
//屬性:
//可讀寫
public string Pname
{
set { _Pname = value; }
get { return _Pname; }
}
//只讀
public bool IsNoEmperty
{
get { return _IsNoEmperty; }
}
//可檢測賦值是否正確
public float Price
{
set
{
if (value >= 0)
_Price = value;
else
throw new Exception("Price的賦值范圍");
}
get
{
return _Price;
}
}
//賦值時更改其他狀態
public int PCount
{
set
{
_PCount = value;
_IsNoEmperty = true; //改變了_IsNoEmperty字段的值
}
get { return _PCount; }
}
public void Print()
{
Console.WriteLine("產品信息如下:");
Console.WriteLine("產品名稱:{0}",_Pname);
Console.WriteLine("產品價格:{0}", _Price);
Console.WriteLine("庫存數量:{0}", _PCount);
Console.ReadLine();
}
static void Main(string[] args)
{
Product P1=new Product();
P1.Pname="黑人牙膏(克)";
P1.Price=5;
P1.PCount=20;
P1.Print();
}
}
小結:引入屬性的優點
1.維護私有字段(保證類的封裝性)
2.可控制訪問(只讀/只寫,確保賦值的正確性等)
3.不用注重細節(直接使用,不需要考慮復雜的處理代碼)
至於引入屬性的益處在更多的c#程序中會領會的愈加深入
問題:什么情況下選擇使用字段還是屬性?
從例子中可看到屬性其實就是對私有字段的讀取和寫入,以便做些公有字段無法完成的任務,他的使用方式和公有字段完全一樣,所以可以理解成屬性是為了滿足對公有字段的特殊需求而產生的附屬品。因而當我們選擇使用屬性還是使用字段時,主要看需求,如果不需設置訪問權限、不需在賦值時檢測值是否滿足要求、不需要在賦值時修改對象其他一些狀態等特殊的需求時,使用公有字段即可,否則就使用屬性。