C# 变量更改时是否会引发事件?

C# 变量更改时是否会引发事件?,c#,variables,events,C#,Variables,Events,我知道正确的做法是创建一个类,在所述类中创建一个事件,然后在程序的另一部分中使用所述类,在该部分中变量将被更改(例如,在计算器的“相等”按钮中使用所述类,以便事件处理程序知道变量已被更改,因为事件将被触发)。但是,为了简化我的代码,我正在寻找一种方法来直接监视变量,而不使用无限循环/计时器,并在变量更改时引发事件。有这样的事吗?如果没有,除了我提到的那一个,还有其他选择吗 我想说的是: 更改变量的代码->另一段代码(不是循环)监视更改,然后在发生更改时抛出一个事件->事件处理程序-/p>您不能使

我知道正确的做法是创建一个类,在所述类中创建一个事件,然后在程序的另一部分中使用所述类,在该部分中变量将被更改(例如,在计算器的“相等”按钮中使用所述类,以便事件处理程序知道变量已被更改,因为事件将被触发)。但是,为了简化我的代码,我正在寻找一种方法来直接监视变量,而不使用无限循环/计时器,并在变量更改时引发事件。有这样的事吗?如果没有,除了我提到的那一个,还有其他选择吗

我想说的是:


更改变量的代码->另一段代码(不是循环)监视更改,然后在发生更改时抛出一个事件->事件处理程序-/p>您不能使用字段,只能使用属性:

class SomeClass : INotifyPropertyChanged
{
    private string someProperty;
    public string SomeProperty 
    {
        get { return someProperty; }
        set { someProperty = value; OnPropertyChanged(); }
    }

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};
}
编辑(.net 4.0)

编辑(Winforms示例)


您不能使用字段,但可以使用属性:

class SomeClass : INotifyPropertyChanged
{
    private string someProperty;
    public string SomeProperty 
    {
        get { return someProperty; }
        set { someProperty = value; OnPropertyChanged(); }
    }

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};
}
编辑(.net 4.0)

编辑(Winforms示例)


您不能使用字段,但可以使用属性:

class SomeClass : INotifyPropertyChanged
{
    private string someProperty;
    public string SomeProperty 
    {
        get { return someProperty; }
        set { someProperty = value; OnPropertyChanged(); }
    }

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};
}
编辑(.net 4.0)

编辑(Winforms示例)


您不能使用字段,但可以使用属性:

class SomeClass : INotifyPropertyChanged
{
    private string someProperty;
    public string SomeProperty 
    {
        get { return someProperty; }
        set { someProperty = value; OnPropertyChanged(); }
    }

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};
}
编辑(.net 4.0)

编辑(Winforms示例)


虽然我知道在堆栈溢出时,这是一种通常不受欢迎的做法,但您可能会发现我的项目NMF表达式很有趣:

基本上,该项目的目标是允许您编写如下内容:

var myObservedVariable = Observable.Expression(() => whatever you want)
在此场景中,
myobserved变量
将为
INotifyValue
,它提供了一个
ValueChanged
事件。或者,您可以使用查询语法。或者,您可以看看其他类似的框架,如BindableLINQ或。对后者进行了比较


但是,这仅在非常强的假设下有效,例如您正在使用的所有对象模型都完全支持
INotifyPropertyChanged
INotifyCollectionChanged

虽然我知道在堆栈溢出时这是一种不希望出现的做法,但您可能会发现我的项目NMF表达式很有趣:

基本上,该项目的目标是允许您编写如下内容:

var myObservedVariable = Observable.Expression(() => whatever you want)
在此场景中,
myobserved变量
将为
INotifyValue
,它提供了一个
ValueChanged
事件。或者,您可以使用查询语法。或者,您可以看看其他类似的框架,如BindableLINQ或。对后者进行了比较


但是,这仅在非常强的假设下有效,例如您正在使用的所有对象模型都完全支持
INotifyPropertyChanged
INotifyCollectionChanged

虽然我知道在堆栈溢出时这是一种不希望出现的做法,但您可能会发现我的项目NMF表达式很有趣:

基本上,该项目的目标是允许您编写如下内容:

var myObservedVariable = Observable.Expression(() => whatever you want)
在此场景中,
myobserved变量
将为
INotifyValue
,它提供了一个
ValueChanged
事件。或者,您可以使用查询语法。或者,您可以看看其他类似的框架,如BindableLINQ或。对后者进行了比较


但是,这仅在非常强的假设下有效,例如您正在使用的所有对象模型都完全支持
INotifyPropertyChanged
INotifyCollectionChanged

虽然我知道在堆栈溢出时这是一种不希望出现的做法,但您可能会发现我的项目NMF表达式很有趣:

基本上,该项目的目标是允许您编写如下内容:

var myObservedVariable = Observable.Expression(() => whatever you want)
在此场景中,
myobserved变量
将为
INotifyValue
,它提供了一个
ValueChanged
事件。或者,您可以使用查询语法。或者,您可以看看其他类似的框架,如BindableLINQ或。对后者进行了比较



但是,这仅在非常强的假设下有效,例如您正在使用的所有对象模型都完全支持
INotifyPropertyChanged
INotifyCollectionChanged

除了@Florian的答案,您还可以在编译时使用注入INotifyPropertyChanged接口的实现。

除了@Florian的答案,您还可以在编译时使用注入INotifyPropertyChanged接口的实现。

除了@Florian的答案,您可以在编译时使用注入INotifyPropertyChanged接口的实现。

除了@Florian的答案外,您还可以在编译时使用注入INotifyPropertyChanged接口的实现。

您可以使用吗?这是在Winforms或WPF中,还是仅仅是普通代码(没有UI,没有dispatcher)?你能用吗?这是在Winforms或WPF中,还是只有普通代码(没有UI,没有调度程序)?你能用吗?这是在Winforms或WPF中,还是只有普通代码(没有UI,没有调度程序)?你能用吗?这是在Winforms或WPF中,还是只有普通代码(没有UI,没有调度程序)?这是WPF技术。在Winforms或其他代码中不起同样的作用您应该只在属性实际更改值
if(value!=someProperty){/*set字段和fire event*/}
@Maarten时引发事件这是一个需求问题。。。大部分时间我都能活下来without@Maarten但你当然是对的。它将避免触发不必要的事件…不幸的是,我使用的是.NET4。但是,当我转到.NET4.5时,我会将此作为参考。这是一个WPF技术。在Winforms或其他代码中不起同样的作用。只有当属性实际更改值
if(value!=someProperty){/*set字段,并触发事件*/}
@Maarten th时,才应引发事件