[英]Should I use a field or a property?
首先,我已經閱讀了詢問字段和屬性之間差異的問題,我知道它的用途。
現在我的問題是,我想創建一個屬性,我確信get和set都是空的,所以我get; set;
get; set;
。 一切都很好。 但是現在我意識到我剛剛創建了一個帶有大寫名稱的公共領域,它在各方面都是相同的。
即使是使用它的論點,因此未來的代碼也不能依賴於實現,因為我可以簡單地將其作為屬性並實現getter或setter。 字段和屬性的語義在它定義的類之外是相同的。
所以我的問題是,當一個屬性只使用get;set;
時,我應該使用字段還是屬性get;set;
?
所以這:
public IEnumerable<string> Products;
在各方面都是相同的:
public IEnumerable<string> Products { get; set; }
當一個屬性只使用get; set;?時,我應該使用字段還是屬性?
出於以下實際原因使用屬性...以及屬性公開狀態API的哲學原因,而字段公開狀態實現細節。
字段和屬性的語義在它定義的類之外是相同的。
這不是真的。
Products
成為屬性時,使用SomeMethod(ref x.Products)
代碼將變為無效。) foo.Location.X = 10
工作時Location
是一個字段(因為x.Location
被歸類為一個變量),而它並不時Location
是property(因為表達式x.Location
被分類為一個值)。 如果你有一個方法(在你的邪惡的可變類型中)改變了值,那么foo.Location.DoSomething()
將在兩種情況下編譯,但具有不同的效果。 為所有家庭帶來樂趣。 這取決於具體情況。 我寧願在場上使用該物業。 您已經提到過public IEnumerable<string> Products;
和public IEnumerable<string> Products { get; set; }
public IEnumerable<string> Products { get; set; }
public IEnumerable<string> Products { get; set; }
是一樣的,但在實際並非如此。 在編譯期間,屬性將轉換為兩個方法(即get_Products()和set_Products())。
屬性的優點是允許您在分配和返回數據之前指定自定義代碼,這在字段中是不可能的。 請查看以下示例
public IEnumerable<string> Products
{
get
{
if(DateTime.Now.Date > Convert.ToDateTime("01-01-2016"))
{
//Return future product
return new List<string>();
}
else
{
// return current products
return new List<string>() { "testing" };
}
}
set
{
if (DateTime.Now.Date > Convert.ToDateTime("01-01-2016"))
{
//ignore assign product
Products = new List<string>();
}
else
{
// add assign product
Products = value;
}
}
}
使用自動屬性語法是首選,因為它創建具有私有后備字段的讀/寫屬性,從而允許您更改實現(從私有標量字段到字典條目或其他后端與其他自定義邏輯),因此從其實現中釋放“類的接口”(與interface
)。
請注意,對於集合成員屬性,建議將其setter設置為private,如下所示:
public IEnumerable<String> Products { get; private set;}
...那樣只有包含類可以改變它。
另一個替代方案是private readonly
字段,在C#6中,您可以使用自動實現的屬性和readonly
備用字段,如下所示:
public IEnumerable<String> Products { get; } = SomeSource.GetProducts();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.