簡體   English   中英

getter和setter中的冗余代碼

[英]Redundant code in getters and setters

我有一個類需要在更改任何屬性時調用NotifyPropertyChanged方法。 我在例子中看到的是:

private string property1_;
public string Property1
{
    get { return property1_; }
    set { property1_ = value; NotifyPropertyChanged(); }
}
private string property2_;
public string Property2
{
    get { return property2_; }
    set { property2_ = value; NotifyPropertyChanged(); }
}
// .......

這真的是慣用的方式嗎? 對於我想要添加的每個屬性,它需要幾行樣板。 此外,如果我想更改屬性和字段的名稱,我需要更改4個不同的東西。 這似乎違反了DRY。

是的,這是提升PropertyChanged的慣用方法。 沒有簡單的方法,因為setter需要一個額外的方法調用,唯一的方法是使用完整的屬性和支持字段。

它實際上曾經更糟糕,因為在.NET 4.5之前你必須將屬性名稱作為字符串傳遞給“NotifyPropertyChanged”,所以現在更改名稱實際上要容易得多。

也就是說,如果你選擇使用它們,會有一些框架(MVVMLight,Caliburn.Micro)為你注入事件加注。 當然,他們只是給你一點合成糖,最終結果是一樣的。

您可能想嘗試使用AOP框架來實現INotifyPropertyChanged 我個人最喜歡的這個例子叫做Fody。

你會寫這樣的類......

[ImplementPropertyChanged]
public class Foo
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

在完成MsBuild之后,Fody會通過重寫你的dll來實現你的INPC代碼。

PostSharp( https://www.postsharp.net/model/inotifypropertychanged )是另一個編譯時選項,用於自動生成INotifyPropertyChanged事件,該事件使用屬性來指示應該執行此操作的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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