繁体   English   中英

在类中,您是否将值赋给属性或支持字段

[英]inside the class do you assign the value to the property or the backing field

假设我在类中有以下内容(扩展了MVVMLight的ViewModelBase):

private ObservableCollection<Merchant> merchants;

public ObservableCollection<Merchant> Merchants
{
    get { return merchants; }
    set { Set(nameof(Merchants), ref merchants, value); }
}

在我的课程中,我应该初始化属性或支持字段的值吗? 在我的课程方法中,我应该使用属性还是支持字段?

我只是在学习,而且我倾向于使用两者,而且我看不出任何区别。

简单地说:在课堂内,我应该使用该属性还是其支持领域?

我去了酒店。 这样,当您向getter或setter添加逻辑(例如,验证)时,您不必更改任何其他内容。

这真的取决于你想做什么。

当您的属性引发PropertyChanged ,最好使用属性设置器而不是支持字段,即使是在您的类中,也可以通知消费者更改的值。

但有一个例外:在构造函数中,您将使用支持字段,因为当时没有消费者可能订阅了PropertyChanged事件,因此不需要从构造函数中引发事件。

如果你的setter中有其他逻辑 - 比如验证 - 你总是应该使用属性设置器而不是支持字段。

得到的整个想法get; set; get; set; 是从类中授予对“后备字段”的受控级别的访问权限,否则可能无法查看它。

考虑到这一点,您可以假设get或set将会拥有它自己的逻辑,以便其他类访问支持字段的值或以特定方式设置它。 您可能希望也可能不希望此类(拥有支持字段的类)调用自定义getter / setter,并且您应该参考哪个属性。

如果它是同时具有getter和setter的属性,请使用具有以下语法的automatic属性:

public ObservableCollection<Merchant> Merchants { get; set; }

如果您必须限制对其中一个的访问,请执行以下操作:

public ObservableCollection<Merchant> Merchants { get; private set; }

使用私有支持字段的唯一原因是它是readonly ,然后您将在构造函数中初始化它,或者如果您在设置属性值时有一些额外的逻辑(例如,在实现INotifyPropertyChanged时 )。

此外,使用属性访问更加重构友好。

底线:使用属性设置器,除非它是一个不可变(readonly)字段,或者你想绕过属性的setter逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM