gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:46:02 24 4
gpt4 key购买 nike

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

  cds2.AfterApplyUpdates := cds1.AfterApplyUpdates;
cds2.AfterCancel := cds1.AfterCancel;
cds2.AfterClose := cds1.AfterClose;

  cds2.CommandText       := cds1.CommandText;
cds2.AutoCalcFields := cds1.AutoCalcFields;
cds2.DisableStringTrim := cds1.DisableStringTrim;

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

如果我们简单地将一个客户端数据集分配给另一个客户端数据集(如下所示),这还不够吗?

  cds2 := cds1;

最佳答案

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

假设您有以下声明:

var
o1, o2: TObject;
....
o1 := TObject.Create;
o2 := o1;

此时,您已经创建了一个对象,并且 o1o2 都引用或指向同一个对象。您通过 o1 引用所做的任何更改也可以通过 o2 引用看到,因为只有一个对象或实例。

因此,在您的场景中,您有 cds1cds2,它们可能引用不同的实例。这意味着

cds2.CommandText := cds1.CommandText;

cds1.CommandText 的值复制到cds2.CommandText

这与

完全不同
cds2 := cds1;

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

在此处查找有关引用类型和值类型的更多讨论:Why should we use classes rather than records, or vice versa? .

总之,您提供的两个选项的作用截然不同。您当前使用的复制属性值的代码可能可以工作。在这种情况下,您建议的对复制引用的更改肯定不会达到您想要的效果。

关于delphi - 要从一个对象复制到另一个对象,我可以直接分配变量,还是必须单独分配它们的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24887218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com