要从一个对象复制到另一个对象,我可以直接分配变量,还是必须单独分配它们的属性?

Vis*_*ari 8 delphi

我想澄清一个疑问.在我当前的项目中,我发现有两个TClientDataSet组件.并将一个客户端数据集的属性和事件处理程序分配给另一个客户端数据集,如下所示:

  cds2.AfterApplyUpdates := cds1.AfterApplyUpdates;
  cds2.AfterCancel       := cds1.AfterCancel;
  cds2.AfterClose        := cds1.AfterClose;
Run Code Online (Sandbox Code Playgroud)

  cds2.CommandText       := cds1.CommandText;
  cds2.AutoCalcFields    := cds1.AutoCalcFields;
  cds2.DisableStringTrim := cds1.DisableStringTrim;
Run Code Online (Sandbox Code Playgroud)

是否需要上述事件处理程序和属性的分配?

如果我们只是将一个客户端数据集分配给另一个,如下所示,这还不够吗?

  cds2 := cds1;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 15

Delphi类是引用类型.这意味着当您定义一个类型为类的变量时,您实际拥有的是对象的引用或指针.这使得赋值运算符的含义:=是引用赋值而不是值赋值.

假设您有以下声明:

var
  o1, o2: TObject;
....
o1 := TObject.Create;
o2 := o1;
Run Code Online (Sandbox Code Playgroud)

此时,您已经创建了一个对象,都o1o2参考,或点,同一个对象.由于只有一个对象或实例,因此通过o1引用也可以看到通过o2引用所做的任何更改.

所以,在你的情况,你有cds1cds2那,大概,是指不同的实例.这意味着

cds2.CommandText := cds1.CommandText;
Run Code Online (Sandbox Code Playgroud)

复制cds1.CommandTextto 的值cds2.CommandText.

这完全不同于

cds2 := cds1;
Run Code Online (Sandbox Code Playgroud)

它会复制引用,并导致您失去对引用的单独对象的跟踪cds2.

在此处查找有关引用类型和值类型的更多讨论:为什么我们应该使用类而不是记录,反之亦然?.

总之,您提供的两个选项会做很多不同的事情.您当前使用的代码复制属性值,可能会起作用.在这种情况下,您建议的复制引用更改肯定不会达到您想要的效果.