假设我在类中有以下内容(扩展了MVVMLight的ViewModelBase):
private ObservableCollection<Merchant> merchants;
public ObservableCollection<Merchant> Merchants
{
get { return merchants; }
set { Set(nameof(Merchants), ref merchants, value); }
}
在我的课程中,我应该初始化属性或支持字段的值吗?在我的课程方法中,我应该使用属性还是后备字段?
我只是在学习,而且我倾向于同时使用这两种方法,而且我没有看到任何区别。
简单地说:在课堂内,我应该使用该属性还是其支持字段?
答案 0 :(得分:5)
我会去酒店。这样,当您向getter或setter添加逻辑(例如,验证)时,您不必更改任何其他内容。
答案 1 :(得分:5)
这实际上取决于你想做什么。
当您的财产提升PropertyChanged
时,最好使用属性设置器而不是支持字段,即使是在您的类中,也可以通知消费者更改的值。
但有一个例外:在构造函数中,您将使用支持字段,因为当时没有消费者可能订阅了PropertyChanged
事件,因此不需要从构造函数中引发事件。
如果你的setter中有其他逻辑 - 比如验证 - 你总是应该使用属性设置器而不是支持字段。
答案 2 :(得分:0)
get; set;
的整个想法是从类中授予对“支持字段”的受控级别的访问权限,否则可能无法看到它。
考虑到这一点,您可以假设get或set将会拥有它自己的逻辑,以便其他类访问支持字段的值或以特定方式设置它。您可能希望也可能不希望此类(拥有支持字段的类)调用自定义getter / setter,并且您应该参考哪个属性。
答案 3 :(得分:0)
如果它是同时具有getter和setter的属性,请使用具有以下语法的automatic属性:
public ObservableCollection<Merchant> Merchants { get; set; }
如果您必须限制对其中一个的访问权限,请执行以下操作:
public ObservableCollection<Merchant> Merchants { get; private set; }
使用私有支持字段的唯一原因是,当它是 readonly 时,然后您将在构造函数中初始化它,或者如果您在设置属性值时有一些额外的逻辑(例如,实现 INotifyPropertyChanged 时。
此外,使用属性访问更加重构友好。
底线:使用属性设置器,除非它是一个不可变(readonly)字段,或者你想绕过属性的setter逻辑。