轮询对象的公共变量

时间:2013-08-19 13:23:02

标签: c# .net oop

我想在bool变量(对象的公共变量)发生变化时立即通知程序。例如;

说,在Windows窗体应用程序中创建了类conn的实例。

有一个Ready变量,类conn的公共变量存在。

我希望在此变量发生变化时收到通知。

我做了一个快速的研究来解决stackoverflow中的这个问题,但答案建议使用属性,我认为这不适合我的应用程序。

2 个答案:

答案 0 :(得分:4)

当你说公共变量时,我会假设你指的是一个字段。

除少数例外情况外,最好不要在C#类中使用公共字段,而是使用公共访问者的私有字段:

class BadClass
{
    public int Value; // <- NOT preferred
}

class GoodClass
{
    private int value;

    public int Value
    {
        get { return this.value; }
        set { this.value = value; }
    }
}

以这种方式构造代码的原因之一是,您可以在属性的getter和setter中执行多项操作。适用于您的方案的示例是属性更改通知:

class GoodClass : INotifyPropertyChanged
{
    private int value;

    public int Value
    {
        get { return this.value; }
        set
        {
            this.value = value;
            this.OnPropertyChanged("Value");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string name)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(name);
        }
    }
}

如果您要像这样实现您的类,您可以这样使用它:

void SomeMethod()
{
    var instance = new GoodClass();
    instance.PropertyChanged += this.OnPropertyChanged;
}

void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Value")
    {
        // Do something here.
    }
}

如果更改Value属性,它不仅会更改基础字段的值,还会引发PropertyChanged事件,并调用事件处理程序。

答案 1 :(得分:1)

您想要使用Observer pattern。在.NET中最直接的方法是事件系统。在课程conn中,创建一个事件:

public event EventHandler ReadyChanged;

然后在创建conn的实例时,订阅该事件:

o.ReadyChanged += (s, e) =>
{
    // do something
}

然后最后,当标记在conn中更改时,通过名为OnReadyChanged的新方法触发事件:

protected virtual void OnReadyChanged()
{
    if (ReadyChanged != null) { ReadyChanged(this, new EventArgs()); }
}