如何捕获成员变量的变化? (C#)

时间:2011-08-14 14:59:21

标签: c# c#-2.0

这似乎是该语言的基础知识,但我不明白这是如何在.Net中完成的。我在一个类中有一个成员变量,比如bool _isCommitted。我希望只要_isCommitted为真,就会发生一些事情。像这样:

     //Whenever _isCommitted == true()
     {
         Foo()
     }

基本上就像一个事件,但这里是我的变量。如何?非常感谢..

4 个答案:

答案 0 :(得分:12)

这通常通过属性和支持私有字段来完成。您需要确保您只能通过酒店进入。

private bool _isCommitted;

public bool IsCommitted
{
  get { return _isCommitted; }
  set
  {
     if(value)
     {
        //do something
     }

     _isCommitted = value;
  }
}

答案 1 :(得分:3)

在最基本的级别,您可以在班级中创建一个活动:

public delegate void MyHandler(bool b);
public event MyHandler CommittedChanged;

现在人们可以像这样订阅你的活动:

public void SomeHandlerMethod(bool b) { ... }

...

someInstance.CommittedChanged += SomeHandlerMethod;
someInstance.CommittedChanged += ASecondHandlerMethod;
someInstance.CommittedChanged += x => { /* inline handler using lambda */ };

用户可以通过这种方式取消注册其事件处理程序:

someInstance.CommittedChanged -= SomeHandlerMethod;

无论您决定更改变量,都会按照以下方式进行操作:

if (CommittedChanged != null) CommittedChanged(_isCommitted);

这将调用已为您的活动注册功能的所有人。

说到这里,你可以做很多改进。首先,将_isCommitted放入属性中,并在其setter中执行事件回调。这样,您就不会忘记致电处理程序。

public IsCommitted { 
   get { return _isCommitted; } 
   set {  
     _isCommitted = value; 
     if (CommittedChanged != null) CommittedChanged(_isCommitted);
   }
}

详细了解活动here

这足以让你前进。但是,如果您深入研究C#框架,您将找到在System.ComponentModel命名空间内使用此事件框架的标准方法。最后,界面INotifyPropertyChanged与一个更通用的事件系统紧密相关,该系统也可以与微软自己的一些技术(如WPF)配合使用,允许GUI元素自动获取类的更改。详细了解INotifyPropertyChanged here

答案 2 :(得分:1)

你基本上需要PropertyChangedEvent PropertyChangedEventHandler Delegate

答案 3 :(得分:1)

我认为C# properties就是您所需要的。

private bool _isCommitted;

    public bool IsCommitted
    {
        get { return _isCommitted; }
        set { if(value){/*DO SOMETHING HERE*/}
            _isCommitted = value; }
    }