0

当作为对象的公共变量的布尔变量发生变化时,我想立即通知程序。例如;

比如说,一个类的实例conn是在 Windows 窗体应用程序中创建的。

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

每当此变量发生变化时,我都希望得到通知。

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

4

2 回答 2

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事件,并调用您的事件处理程序。

于 2013-08-19T13:31:34.933 回答
1

您想为此使用观察者模式。在 .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()); }
}
于 2013-08-19T13:30:22.600 回答