C#中的屬性和欄位的區別
屬性和欄位的區別和聯絡
問題: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#程式中會領會的愈加深入
問題:什麼情況下選擇使用欄位還是屬性?
從例子中可看到屬性其實就是對私有欄位的讀取和寫入,以便做些公有欄位無法完成的任務,他的使用方式和公有欄位完全一樣,所以可以理解成屬性是為了滿足對公有欄位的特殊需求而產生的附屬品。因而當我們選擇使用屬性還是使用欄位時,主要看需求,如果不需設定訪問許可權、不需在賦值時檢測值是否滿足要求、不需要在賦值時修改物件其他一些狀態等特殊的需求時,使用公有欄位即可,否則就使用屬性。
相關文章
- IL角度理解C#中欄位,屬性與方法的區別C#
- C#屬性與欄位C#
- c#之事件_方法_屬性_欄位C#事件
- C#通過反射獲取物件屬性,列印所有欄位屬性的值C#反射物件
- Scala的類、屬性、物件欄位物件
- C#快速入門教程(5)——欄位與屬性C#
- C#學習筆記-欄位、屬性、索引器C#筆記索引
- CSS樣式中的right屬性和margin-right屬性的區別CSS
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- KEEP POOL和CACHE屬性的區別
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- CSS中px和em屬性的特點與區別CSS
- c# saf 框架欄位屬性多層巢狀示例C#框架巢狀
- select * 和 select 所有欄位的區別
- LOB欄位EMPTY_LOB和NULL的區別Null
- php中呼叫類的屬性和函式的方法->_=>_::_$this->區別PHP函式
- ms sql 獲取表欄位的屬性SQL
- C#中屬性的解析C#
- maxlength和size屬性區別
- odoo欄位屬性列舉Odoo
- 裝備屬性欄位設計和投放詳解
- HIBERNATE的對映---資料庫表中欄位和對應持久化類中屬性都是自定義型別的?資料庫持久化型別
- python的dir()和__dict__屬性的區別Python
- 標籤的readonly和disabled屬性的區別
- input屬性disabled和readonly的區別(轉)
- 文字框的readonly和disabled屬性區別
- js 物件方法、類方法、原型方法的區別;私有屬性、公有屬性、公有靜態屬性的區別JS物件原型
- Scala類的屬性以及物件私有欄位物件
- C#中Hashtable和HashMap的區別C#HashMap
- C#中ref和out的區別C#
- 深入理解JavaScript類與物件:揭秘類欄位和靜態屬性的妙用,js靜態屬性和例項屬性JavaScript物件JS
- disabled和readonly屬性區別
- 共有的表單欄位屬性
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- windows域控裡,屬性和欄位對映表Windows
- IOT中溢位區屬性pctthreshold和including驗證
- lambda 表示式從集合中獲取某個欄位屬性的集合
- python屬性和方法的區別是什麼Python