屬性其實是一個方法

屬性一般是public,而欄位private

屬性名稱首字母大寫,欄位通常第一個是下劃線_

private int _age;
public int Age
{
get{return _age;}
set{_age = value;}
}

一般來說可以通過屬性中getset設置條件,來操作欄位的讀寫以及範圍屬性當然上面一段代碼寫起來比較麻煩,C# 6.0裡面的自動屬性大幅度簡化,可以這麼寫

public int Age{get;set;}


屬性(C# 編程指南)

屬性是一種成員,它提供靈活的機制來讀取、寫入或計算私有欄位的值。屬性可用作公共數據成員,但它們實際上是稱為訪問器的特殊方法。這使得可以輕鬆訪問數據,還有助於提高方法的安全性和靈活性。

欄位(C# 編程指南)

欄位是在結構中直接聲明的任意類型的變數。欄位是其包含類型的成員。

欄位就是類和結構中聲明的變數。

屬性這是一種成員,可以設置它的讀取、寫入或計算的機制。

舉個例子:

描述一個人的信息

【生日】抽象為欄位比較合適,因為不需要額外的計算。

【年齡】抽象為屬性比較合適,因為需要【生日】和【當前時間】進行計算,而且具有隻讀特性。


public class A
{
private int i;//欄位
public int I //屬性
{
get { return i;} //取屬性I實際返回欄位i的值
set
{
if (value &> 0)
{
i = value; //滿足條件給欄位i一種賦值
}
else
{
i = 0; //不滿足條件賦另一種值
}
}
}
}

1、屬性更靈活,2、屬性是一種方法,3、屬性實際是用來給欄位賦值的,如果願意的話。

不知道這樣理解對不對


欄位是一個數據,屬性是一個或一對操作欄位的方法。

粗略來說,欄位=數據,屬性=數據(可不聲明)+操作數據的方法。

自動屬性(即常見的 get;set;)不需要顯式聲明欄位,編譯器會自動創建它。所以屬性一般表面看不見欄位,只有方法,而實際上它包含了一個欄位。

屬性本質是一個語法糖,方便了程序員對類中欄位的操作。而且屬性在客戶端訪問就是一個欄位。

(參考以下書上的內容,會有更清晰的理解)

以下內容摘自《C#高級編程(第 11 版)》第三章 :

欄位和屬性都是類的成員。

欄位:是類的數據成員,它是類型的一個變數,該類型是類的一個成員。

以 PhoneCustomer 類為例子:

class PhoneCustomer
{
public const string DayOfSendingBill-"Monday";//常量
public int CustomerID;//欄位
public string FirstName;//欄位
public string LastName;//欄位
}

欄位是與類相關的變數。一旦實例化 PhoneCustomer 對象,就可以使用語法 Object.FieldName訪問這些欄位。

  • 欄位是與類相關的變數。
  • 常量與類關聯方式和變數與類的關聯方式相同。
  • 如果構造函數沒有給欄位賦值,它的值就是其特定數據類型的默認值。
  • 最好不要把欄位聲明為public,最好聲明為private。
  • 只讀欄位(通過 readonly 實現)和只讀屬性(只實現 get方法)是不同的。

屬性:是可以從客戶端訪問的函數值,其訪問方式與訪問類的公共欄位類似。C#為讀寫類中的屬性提供了專用語法,所以不必使用那些名稱中嵌有Get或Set的方法。因為屬性的這種語法不同於一般函數的語法。所以在客戶端代碼中,虛擬的對象被當作實際的東西。

屬性(property)的概念是:它是一個方法或一對方法。在客戶端看來,它(們)是一個欄位。

具有表達式體的屬性訪問器:

private string _firstName; //欄位
public string FirstName //屬性
{
get =&> _firstName;
set =&> _firstName=value;
}

自動屬性的實現:如果屬性的set和get訪問器中沒有任何邏輯,就可以使用自動實現屬性。不需要聲明私有欄位。編譯器會自動創建它。使用自動屬性,就不能直接訪問欄位,因為不知道編譯器生成的名稱。使用了自動實現的屬性,就不能在屬性設置中驗證屬性的有效性。

public int Age { get; set; }//屬性


最直觀的區別是,屬性可以單獨設置讀/寫的許可權,而欄位不能。比如

public int Prop { get; private set; } // public get, private set

複雜一些,屬性的讀寫可以是一段邏輯。比如

public int Prop {get { do something; return member; } set { do something; member = value; } }

Properties (C# Programming Guide)


屬性是語法上一等公民,實戰的時候,能用屬性的時候不用欄位,不用管底層是怎麼回事。
推薦閱讀:
相關文章