2009-11-24 1 views
1

Возможно ли вообще создать eventlisteners (т. Е. При изменении значения) для переменной типа string, int, bool и т. Д.?Возможно ли создать eventlisteners для string, int, bool?

Я пока не видел этого на любом языке программирования, за исключением некоторых коллекций (например, ArrayCollection в Flex), которые используют события для обнаружения изменений в коллекции.

Если это вообще невозможно, почему бы и нет? В чем причина этого? Существуют ли какие-либо рекомендации для достижения такой же функциональности? А как насчет расширения функциональности с привязкой данных?

ответ

2

Я предполагаю, что эта функциональность не добавляется ни в какую фреймворк/среду выполнения, поскольку она создавала бы большие накладные расходы (подумайте о том, сколько раз вы изменяете переменную, содержащую примитивный тип в среднем приложении), в то время как она не используется в обычном режиме circunstances.

В любом случае, в .NET по крайней мере (и, я думаю, это также в других средах OO) вы можете определить свойства свойства, к которым обращаются как обычные переменные, но могут иметь связанный код, который реагирует, когда его значение читается или модифицирована.

3

Я не думаю, что есть что-то по умолчанию, однако вы можете создать настраиваемое событие и поднять его на набор методов. Что-то вроде ...

C# пример

public delegate void MyValueChangedEventHandler(bool oldValue, bool newValue); 
public event MyValueChangedEventHandler MyValueChanged; 
private bool myValue; 
... 

public bool MyValue 
{ 
    get { return myValue; } 
    set 
    { 
     if (myValue != value) 
     { 
      var old = myValue; 
      myValue = value; 
      MyValueChanged(old, myValue); 
     } 
    } 
} 
1

Это возможно, если вы заключаете переменные в добытчиками и сеттеров и сгореть случай, когда сеттер называется.

1

Как насчет использования методов настройки и их регистрации при изменении значения переменной?

1

В общем, нет. Причина -, что примитивные типы - это просто бит и байты, хранящиеся в некоторой ячейке памяти: изменение данных в этой ячейке памяти делает именно это, и ничего больше. Для проведения обстрелов потребуется , вызывая некоторые методы/функции. Таким образом, функциональность может быть достигнута путем переноса примитивных типов в какие-то объекты-оболочки, но, конечно, они не являются взаимозаменяемыми на 100%: например, примитивные типы обертки Java (Integer и т. Д.) Отмечены как final, поэтому невозможно продлить их с версиями, запускающими события, чтобы воспользоваться авто (un) боксом.

Другой подход заключается в частом опросе переменной и при пожаре соответствующих событий, если она изменилась. Это «грязный» подход с очевидными недостатками (накладные расходы на производительность, а не немедленная реакция), но может быть полезен в некоторых ситуациях. Если вы сделаете это из другого потока в Java, обязательно отметьте переменную volatile.

1

Возможно создание слушателей, как упомянули некоторые из других, путем создания класса, который запускает событие всякий раз, когда изменяется свойство. Это, очевидно, намного менее эффективно, чем просто присвоение значения, но бывают случаи, когда это может быть полезно.

Некоторые языки (VB6 и некоторые другие) имеют возможность в режиме отладки прекратить выполнение при изменении значения переменной. Я не видел этого в .net, но он может быть где-то там.:-)

Мне кажется, что использование события для сигнала простого изменения переменной может быть выполнено с помощью операторов if при каждом присваивании, если значение переменной не изменяется извне, и в этом случае вы можете использовать класс для справиться.

Смежные вопросы