我想在bool变量(对象的公共变量)发生变化时立即通知程序。例如;
说,在Windows窗体应用程序中创建了类conn
的实例。
有一个Ready
变量,类conn的公共变量存在。
我希望在此变量发生变化时收到通知。
我做了一个快速的研究来解决stackoverflow中的这个问题,但答案建议使用属性,我认为这不适合我的应用程序。
答案 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()); }
}