Events 是否可以为string、int、bool创建EventListener?

Events 是否可以为string、int、bool创建EventListener?,events,variables,event-handling,Events,Variables,Event Handling,是否可以为string、int、bool等类型的变量创建eventlisteners(即值更改时) 到目前为止,我还没有在任何编程语言中看到这一点,除了一些集合(如Flex中的ArrayCollection),它们使用事件来检测集合中的更改 如果根本不可能,为什么不呢?这是什么原因?是否有实现相同功能的最佳实践?那么如何通过数据绑定扩展功能呢?我认为默认情况下没有任何功能,但是,您可以创建一个自定义事件并在方法集上引发它。类似于 C#示例 我不认为默认情况下有什么,但是,您可以创建一个自定义事件

是否可以为string、int、bool等类型的变量创建eventlisteners(即值更改时)

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


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

我认为默认情况下没有任何功能,但是,您可以创建一个自定义事件并在方法集上引发它。类似于

C#示例


我不认为默认情况下有什么,但是,您可以创建一个自定义事件并在方法集上引发它。类似于

C#示例


如果将变量包装在getter和setter中,并在调用setter时触发事件,这是可能的。

如果将变量包装在getter和setter中,并在调用setter时触发事件,这是可能的。

我猜任何框架/运行时都不会添加这种功能,因为它会产生很大的开销(想想您在平均应用程序中修改了多少次包含基元类型的变量)而在正常情况下不使用


无论如何,至少在.NET中(我想在其他OO环境中也是如此),您可以定义属性,这些属性可以作为普通变量访问,但可以有相关的代码,在读取或修改其值时会做出反应。

我想这类功能不会添加到任何框架/运行时中,因为它会产生很大的开销(想想您在平均应用程序中修改了多少次包含基元类型的变量)而在正常情况下不使用


无论如何,至少在.NET中(我猜在其他OO环境中也是如此),您可以定义属性,这些属性可以作为普通变量访问,但可以具有相关代码,在读取或修改其值时会作出反应。

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

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

一般来说,不是。原因是原语类型只是存储在某个内存位置的位和字节:更改该内存位置中的数据仅此而已,其他什么都没有。触发事件需要调用一些方法/函数。因此,可以通过包装原语类型来实现功能某些包装器对象中的PE—当然,它们不是100%可互换的:例如Java的原始包装器类型(
Integer
等)标记为
final
,因此不可能使用事件触发版本来扩展它们以利用自动(un)装箱


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

,一般来说,不会。原因是原语类型只是存储在某个内存位置的位和字节:更改该内存位置中的数据只会执行此操作,而不会执行任何操作触发事件需要调用一些方法/函数。因此,可以通过在某种包装器对象中包装基元类型来实现功能——但当然,它们不是100%可互换的:例如Java的基元包装器类型(
Integer
等)标记为
final
,因此无法使用事件触发版本扩展它们以利用自动(un)装箱


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

,正如其他一些人所提到的,通过创建一个在属性更改时触发事件的类,可以创建侦听器。这显然比仅使用ass效率低得多点燃一个值,但在某些情况下它可能是有用的

某些语言(VB6和其他一些语言)在调试模式下能够在变量值更改时停止执行。我在.net中没有看到过这种情况,但它可能在其中的某个地方。:-)


在我看来,使用事件来表示简单的变量更改可以在每次赋值时使用if语句来完成,除非该变量的值在外部被更改,在这种情况下,您可以使用类来处理它。

正如其他一些人提到的,通过创建一个每当属性发生变化时,ires都会触发一个事件。这显然比只指定一个值效率低得多,但在某些情况下它可能会很有用

某些语言(VB6和其他一些语言)在调试模式下能够在变量值更改时停止执行。我在.net中没有看到过这种情况,但它可能在其中的某个地方。:-)

在我看来,使用事件来表示简单的变量更改可以在每次赋值时使用if语句来完成,除非该变量的值在外部被更改,在这种情况下,您可以使用类来处理它

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); 
        }
    }
}