Delphi-为什么不在Assign()过程中复制事件?

Delphi-为什么不在Assign()过程中复制事件?,delphi,events,copy,assign,ignore,Delphi,Events,Copy,Assign,Ignore,我观察了几个Assign()过程,并注意到在赋值过程中通常会忽略事件。例如,TBitmap分配方法不复制OnChange事件。我想知道 如果在分配期间不复制事件是一种普遍接受的方式,也就是说,如果所有用户都依赖于这样一个事实,即在分配期间从不复制事件,也不应该复制事件 为什么(至少通常)在分配期间不复制事件 或者也许我错了,事件可能被完美地复制,只是取决于具体情况 关于我不知道有什么“规则”规定了这一点,但我认为你是对的,而且这几乎从未发生过。不过,这取决于组件的作者,因为Assign是在TPe

我观察了几个Assign()过程,并注意到在赋值过程中通常会忽略事件。例如,TBitmap分配方法不复制OnChange事件。我想知道

  • 如果在分配期间不复制事件是一种普遍接受的方式,也就是说,如果所有用户都依赖于这样一个事实,即在分配期间从不复制事件,也不应该复制事件
  • 为什么(至少通常)在分配期间不复制事件
  • 或者也许我错了,事件可能被完美地复制,只是取决于具体情况

  • 关于

    我不知道有什么“规则”规定了这一点,但我认为你是对的,而且这几乎从未发生过。不过,这取决于组件的作者,因为Assign是在TPersistent中引入的,但在实际实现重写之前,它本身不会做任何事情。实际上,默认情况下,它会抛出一个异常(X不能指定给Y)

    这也是分配的力量。您从中分配的源甚至不必是相同类型的组件,因为每个分配都是自定义实现。在TBitmap示例中,您可以将其分配给一个TPicture,甚至可以将其他类型的图形分配给TBitmap,这将允许这些图形在位图的画布上绘制自己

    在我遇到的大多数(如果不是全部的话)情况下,赋值就是这样的:赋值,有时甚至是将一个对象的数据(状态的,如果你愿意)转换成另一个对象

    事件是不同的。由一个对象拥有一个事件处理程序并对其进行管理并不重要。该对象的任务不是决定其订阅者是否也要订阅另一个对象。指向事件处理程序的/指针的值不是对象(相关)数据的一部分

    它只会让其他人听到发生在它身上的事情,如果这些事情也想听到另一个对象,他们只需要为这些对象分配一个事件处理程序


    因此,对我来说,事件不被复制是非常合理的,我认为我自己编写的Assign实现中从未包含事件。

    这取决于组件作者的决定。我可以想象,事件通常不会作为
    Assign
    的一部分复制,因为它们被视为以非常松散的方式定义行为而不是状态。我认为另一个动机是事件隐式包含对另一个对象的引用<代码>分配应复制值而不是引用。如果你写,
    A.Assign(B);B.Free
    ,左
    A
    带有一堆由
    B
    @DavidHeffernan实现的对事件处理程序的陈旧引用,推测B的事件处理程序中保存的方法引用不属于它。。。那会破坏目的,不是吗?这些通常不是对属于配置了B的外部对象的方法的引用吗?通常是这样。也许我的代码样本太简单了。但是有一个非常明显的危险是陈旧的引用。你不能假设这一点。假设“B”有一个“OnChange”事件。假设“B”作为其构造函数中的默认值,已将其分配给它自己的一个方法。如果事件是在“Assign”中复制的,那么在B.Free之后,“A”将有一个过时的引用。我自己编写的一些组件,我不希望事件被转移到另一个实例中-但是我编写的一些其他组件,这将非常方便。不仅是组件,而且通常是持久的。