簡體   English   中英

我應該使用田地還是財產?

[英]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的哲學原因,而字段公開狀態實現細節。

字段和屬性的語義在它定義的類之外是相同的。

這不是真的。

  • 通過反射可以看出差異,這通常非常重要。 例如,許多綁定框架將不使用字段,僅使用屬性。
  • 您可以通過ref傳遞可變字段,但不能傳遞屬性 - 因此將字段更改為屬性會破壞源兼容性。 (當Products成為屬性時,使用SomeMethod(ref x.Products)代碼將變為無效。)
  • 將字段更改為屬性也會破壞二進制兼容性,因此如果程序集X是針對程序集Y v1.0構建的,並且您將字段更改為程序集Y v1.1的屬性,那么您需要重建程序集X或它將無法正確執行
  • 如果你有一個可變的值類型(請不要這樣做),然后寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM