在类中,将值分配给属性还是支持字段
本文关键字:属性 支持 字段 分配 | 更新日期: 2023-09-27 18:35:29
假设我在一个类中有以下内容(扩展了MVVMLight的ViewModelBase):
private ObservableCollection<Merchant> merchants;
public ObservableCollection<Merchant> Merchants
{
get { return merchants; }
set { Set(nameof(Merchants), ref merchants, value); }
}
在我的类中,我应该初始化属性的值还是支持字段的值?在我的类的方法中,我应该使用属性还是支持字段?
我只是在学习,我倾向于同时使用两者,我看不出有任何区别。
简单地说:在类中,我应该使用属性还是它的支持字段?
这真的取决于你想做什么。
当你的属性引发PropertyChanged
时,最好使用属性 setter 而不是支持字段,即使在类中也是如此,这样使用者也会收到更改值的通知。
但有一个例外:在构造函数中,您将使用支持字段,因为当时没有使用者可能订阅了PropertyChanged
事件,因此不需要从构造函数引发事件。
如果您的 setter 中有其他逻辑(如验证),则应始终使用属性 setter 而不是支持字段。
我会选择这个属性。这样,当您向getter或setter添加逻辑(例如,验证)时,您就不必更改任何其他内容。
get; set;
的整个想法是授予对"支持字段"的受控访问级别,否则这些类可能看不到它。
考虑到这一点,您可以假设 get 或 set 将(并且经常)具有自己的逻辑,用于其他类何时访问支持字段的值或以特定方式设置它。您可能希望也可能不希望此类(拥有支持字段的类)调用自定义 getter/setter,并且对于您应该引用哪个属性,您可以回答。
如果它是同时具有 getter 和 setter 的属性,请使用具有以下语法的 auto 属性:
public ObservableCollection<Merchant> Merchants { get; set; }
如果您必须限制对其中一个的访问,请执行以下操作:
public ObservableCollection<Merchant> Merchants { get; private set; }
使用私有支持字段的唯一原因是当它是只读的,然后您将在构造函数中初始化它,或者如果您在设置属性值时有一些额外的逻辑(例如,在实现 INotifyPropertyChanged 时)。
此外,使用属性访问对重构更加友好。
底线:使用属性 setter,除非它是不可变(只读)字段,或者你想要绕过属性的 setter 逻辑。