是否可以为string,int,bool创建eventlisteners?

时间:2009-11-24 10:43:56

标签: events variables event-handling

是否有可能为string,int,bool等类型的变量创建eventlisteners(即值更改时)?

到目前为止,我还没有在任何编程语言中看到过这种情况,除了一些集合(如Flex中的ArrayCollection),它们使用事件来检测集合中的变化。

如果根本不可能,为什么不呢?这是什么原因?是否有任何最佳实践来实现相同的功能?那么使用数据绑定扩展功能呢?

6 个答案:

答案 0 :(得分: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 :(得分:2)

我想这种功能并没有添加到任何框架/运行时,因为它会产生很大的开销(考虑修改一个在普通应用程序中保存基本类型的变量的次数),而不是在正常情况下使用

无论如何,至少在.NET中(我想在其他OO环境中也是如此),你可以定义属性,它们作为普通变量被访问但是可以有相关的代码,当它的读取或修改值。

答案 2 :(得分:1)

有可能将变量包装在getter和setter中,并在调用setter时触发事件。

答案 3 :(得分:1)

如何使用setter方法并让它们在更改变量值时注册事件?

答案 4 :(得分:1)

一般来说,没有。 原因原始类型只是位和字节存储在某个内存位置:更改该内存位置中的数据就是这样,没有别的。发射事件需要调用一些方法/功能。因此,可以通过将基元类型包装在某种包装器对象中来实现功能 - 当然,它们不是100%可互换的:例如Java的原始包装类型(Integer等)被标记为{{1因此,不可能使用事件触发版本扩展它们以利用自动(联合)装箱。

另一种方法是频繁轮询变量并在适当的事件发生变化时触发它。这是一种“肮脏”的方法,具有明显的缺点(性能开销,而不是立即反应),但在某些情况下可能无论如何都有用。如果从Java中的另一个线程执行此操作,请确保标记变量final

答案 5 :(得分:1)

通过创建一个在属性发生变化时触发事件的类,可以像其他人提到的那样创建侦听器。这显然比仅仅分配一个值要低得多,但有些情况下它可能很有用。

某些语言(VB6和其他一些语言)能够在调试模式下在变量值发生变化时停止执行。我没有在.net中看到这个,但它可能会在某处。 : - )

在我看来,使用一个事件来表示简单的变量更改可以通过每个赋值的if语句来完成,除非变量的值在外部被更改,在这种情况下你可以使用一个类来处理它。 / p>