2

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

private ObservableCollection<Merchant> merchants;

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

在我的类中,我应该初始化属性的值还是支持字段?在我的班级的方法中,我应该使用属性还是支持字段?

我只是在学习,我倾向于同时使用两者,我看不出有什么区别。

简单地说:在类中,我应该使用属性还是它的支持字段?

4

4 回答 4

5

我会和物业一起去。这样,当您向 getter 或 setter(例如验证)添加逻辑时,您无需更改任何其他内容。

于 2013-10-16T07:55:02.390 回答
5

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

当您的属性引发PropertyChanged时,使用属性设置器而不是支持字段是一个好主意,即使在您的类中也是如此,因此消费者会收到更改值的通知。

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

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

于 2013-10-16T07:58:53.750 回答
0

的整个想法get; set;是从可能不具有可见性的类授予对“支持字段”的受控级别的访问权限。

考虑到这一点,您可以假设 get 或 set 将(并且通常确实)具有自己的逻辑,用于其他类何时访问支持字段的值或以特定方式设置它。您可能希望也可能不希望此类(拥有支持字段的类)调用自定义 getter/setter,而您的答案就是您应该引用什么属性。

于 2013-10-16T07:57:25.880 回答
0

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

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

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

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

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

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

底线:使用属性设置器,除非它是不可变(只读)字段或者您想规避属性的设置器逻辑。

于 2013-10-16T08:01:08.117 回答