何时使用公共或私有财产

本文关键字:私有财产 何时使 | 更新日期: 2023-09-27 18:28:18

如果我有这样的类:

public class MyClass:INotifyPropertyChanged
{
private Visibility isVisible;
private ObservableCollection<string> names;
public Visibility IsVisible
{
get{ return isVisible;}
set { isVisible = value; OnPropertyChanged("IsVisible");}
}
public ObservableCollection<string> Names
{
get { return names;}
set { names = value; OnPropertyChanged("Names");}
}
//ctor
public MyClass(){
     names = new ObservableCollection<string>();
}

//INotifyPropertyChanged implementation
 public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

在任何人斩首我之前——我已经做了相当多的查找,并找到了混合的答案......

  1. 我是否修改publicprivate属性/变量以在绑定中使用? 即我有一个问题,即添加到names集合将触发OnPropertyChanged而更改isVisible不会触发OnPropertyChanged。我的假设是,这是因为names是一个ObservableCollection,而isVisible不是,但我不确定......

  2. 如果我应该使用public属性 - 拥有私有属性的必要性是什么?

何时使用公共或私有财产

您不需要私有属性,只需私有字段就足够了,因此请替换:

private Visibility isVisible {get; set;}

private Visibility isVisible;

如果我应该使用公共属性 - 需要什么 有私人的吗?

不能将自动属性与 INotifyPropertyChanged 一起使用。这就是为什么您需要为您的财产IsVisible提供一个支持字段。

请参阅:实现 INotifyPropertyChanged 的优雅方法

所以我认为你混淆了属性和字段(又名变量(。

public class Example()
{
    public int FieldExample;
    private int _propertyExample;
    public int PropertyExample 
    {
        get
        {
            return _propertyExample;
        }
        set
        {
            _propertyExample = value;
        }
    }
}

在简单的使用方案中,字段和属性之间的差异并不明显。 但是属性在引擎盖下有不同的管道,允许它们利用反射和绑定。 对于 WPF,这意味着您必须具有公共属性。 公共属性的最佳做法是将其与私有(或受保护(字段相关联 - 该字段名称通常以 _ 和/或以小写字符开头。 这称为"后备场"。

私有支持字段保存实际数据,公共属性只是其他类可以与该数据交互的方式。 在 get 和 set 块中,您可以放置任何您想要的代码:我可以输入:return 5; . 这没有用,而且这种做法很差,但我可以。 通常,驻留在 get 和 set 块中的代码仍应设置或获取值;尽管您可以先验证输入,和/或先设置其格式。 在 WPF 集中实现的模式会引发属性已更改的事件。 程序的其他部分正在侦听该事件,以便它们知道要更新 UI。

因此,在代码中,如果仅更改支持字段而不引发已更改的事件,则 UI 将不会更新。 如果要对对象执行复杂的操作,并且希望推迟执行 UI 更新,直到完成整批项目,则可能需要此行为,但这是一种优化,对于初学者来说,最好始终访问/设置公共属性。