C# 轮询对象';s公共变量
我想在对象的公共变量bool变量发生更改时立即通知程序。比如, 例如,类C# 轮询对象';s公共变量,c#,.net,oop,C#,.net,Oop,我想在对象的公共变量bool变量发生更改时立即通知程序。比如, 例如,类conn的实例是在windows窗体应用程序中创建的 有一个Ready变量,存在conn类的公共变量 每当此变量发生变化时,我都希望得到通知 我在stackoverflow中做了一个快速的研究来解决这个问题,但是答案建议使用属性,我认为这不适合我的应用程序。您想使用属性来解决这个问题。在.NET中实现这一点最直接的方法是事件系统。在类conn中,创建一个事件: public event EventHandler ReadyC
conn
的实例是在windows窗体应用程序中创建的
有一个Ready
变量,存在conn类的公共变量
每当此变量发生变化时,我都希望得到通知
我在stackoverflow中做了一个快速的研究来解决这个问题,但是答案建议使用属性,我认为这不适合我的应用程序。您想使用属性来解决这个问题。在.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()); }
}
你想用这个。在.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()); }
}
当你说公共变量时,我假设你指的是一个字段 除了少数例外,最好不要在C#类中使用公共字段,而是使用公共访问器的私有字段:
class BadClass
{
public int Value; // <- NOT preferred
}
class GoodClass
{
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
}
如果要像这样实现类,可以这样使用:
void SomeMethod()
{
var instance = new GoodClass();
instance.PropertyChanged += this.OnPropertyChanged;
}
void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Value")
{
// Do something here.
}
}
如果您更改
Value
属性,它不仅会更改基础字段的值,还会引发事件并调用事件处理程序。我假设您在说public variable时引用的是字段
除了少数例外,最好不要在C#类中使用公共字段,而是使用公共访问器的私有字段:
class BadClass
{
public int Value; // <- NOT preferred
}
class GoodClass
{
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
}
如果要像这样实现类,可以这样使用:
void SomeMethod()
{
var instance = new GoodClass();
instance.PropertyChanged += this.OnPropertyChanged;
}
void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Value")
{
// Do something here.
}
}
如果更改
Value
属性,它不仅会更改基础字段的值,还会引发事件,并调用事件处理程序。恐怕您需要澄清这一点。为什么房产“不合适”INotifyPropertyChanged
将是一个很好的起点。该语言中没有内置任何内容,您必须使用自定义事件手动实现它。我怀疑您能否说服大多数.Net开发人员属性“不适合”特定应用程序,没有提供任何代码来证明它们的不适用性。恐怕你需要澄清这一点。为什么房产“不合适”INotifyPropertyChanged
将是一个很好的起点。该语言中没有内置任何内容,您必须使用自定义事件手动实现它。我怀疑您能否说服大多数.Net开发人员属性“不适合”特定应用程序,不提供任何代码来证明它们的不适用性。根据您的需求,添加一些检查可能是有益的,比如if(this.value!=value){…}
发送给您的属性设置者,以避免在没有任何更改时引发属性更改
事件。@WillemDuncan这是一个很好的建议。感谢您的回复和宝贵的时间。这是我所需要的一种我能理解的形式。根据您的需求,添加一些检查可能是有益的,比如if(This.value!=value){…}
发送给您的属性设置者,以避免在没有任何更改时引发属性更改
事件。@WillemDuncan这是一个很好的建议。感谢您的回复和宝贵的时间。这就是我所需要的一种我能理解的形式。