как отловить изменения в переменной-члене? (С #) - PullRequest
1 голос
/ 14 августа 2011

Кажется, это основы языка, но я не понимаю, как это делается в .Net. У меня есть переменная-член в классе, скажем, bool _isCommitted. Я хочу, чтобы что-то случилось, когда _isCommitted верно. Примерно так:

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

В основном как событие, но здесь это моя переменная. Как? Большое спасибо ..

Ответы [ 4 ]

12 голосов
/ 14 августа 2011

Обычно это делается через свойства и закрытое приватное поле. Вы должны убедиться, что у вас есть доступ только через собственность.

private bool _isCommitted;

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

     _isCommitted = value;
  }
}
3 голосов
/ 14 августа 2011

На самом базовом уровне вы можете создать событие в своем классе:

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 в свойстве и выполните обратный вызов события в его установщике. Таким образом, вы не забудете вызвать обработчики.

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

Подробнее о событиях здесь .

Этого достаточно, чтобы вы пошли. Однако, если вы углубитесь в среду C #, вы найдете стандартизированный способ использования этой структуры событий внутри пространства имен System.ComponentModel. К счастью, интерфейс INotifyPropertyChanged, который аккуратно связан с более общей системой событий, которая также хорошо работает с некоторыми из собственных технологий Microsoft, такими как WPF, позволяет элементам графического интерфейса автоматически отслеживать изменения в вашем классе. Подробнее о INotifyPropertyChanged здесь .

1 голос
/ 14 августа 2011

Я думаю C # свойства - это то, что вам нужно.

private bool _isCommitted;

    public bool IsCommitted
    {
        get { return _isCommitted; }
        set { if(value){/*DO SOMETHING HERE*/}
            _isCommitted = value; }
    }
1 голос
/ 14 августа 2011

Вам в основном нужен PropertyChangedEvent PropertyChangedEventHandler Delegate

...