C# 轮询对象';s公共变量

C# 轮询对象';s公共变量,c#,.net,oop,C#,.net,Oop,我想在对象的公共变量bool变量发生更改时立即通知程序。比如, 例如,类conn的实例是在windows窗体应用程序中创建的 有一个Ready变量,存在conn类的公共变量 每当此变量发生变化时,我都希望得到通知 我在stackoverflow中做了一个快速的研究来解决这个问题,但是答案建议使用属性,我认为这不适合我的应用程序。您想使用属性来解决这个问题。在.NET中实现这一点最直接的方法是事件系统。在类conn中,创建一个事件: public event EventHandler ReadyC

我想在对象的公共变量bool变量发生更改时立即通知程序。比如,

例如,类
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这是一个很好的建议。感谢您的回复和宝贵的时间。这就是我所需要的一种我能理解的形式。