当作为对象的公共变量的布尔变量发生变化时,我想立即通知程序。例如;
比如说,一个类的实例conn
是在 Windows 窗体应用程序中创建的。
有一个Ready
变量,存在 conn 类的公共变量。
每当此变量发生变化时,我都希望得到通知。
我做了一个快速研究来解决 stackoverflow 中的这个问题,但答案建议使用属性,我认为它不适合我的应用程序。
当您说公共变量时,我会假设您指的是一个字段。
除了少数例外,最好不要在 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
事件,并调用您的事件处理程序。
您想为此使用观察者模式。在 .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()); }
}