首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要从一个对象复制到另一个对象,可以直接分配变量,还是必须单独分配它们的属性?

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

Stack Overflow用户
提问于 2014-07-22 12:18:07
回答 2查看 3K关注 0票数 8

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

代码语言:javascript
复制
  cds2.AfterApplyUpdates := cds1.AfterApplyUpdates;
  cds2.AfterCancel       := cds1.AfterCancel;
  cds2.AfterClose        := cds1.AfterClose;

代码语言:javascript
复制
  cds2.CommandText       := cds1.CommandText;
  cds2.AutoCalcFields    := cds1.AutoCalcFields;
  cds2.DisableStringTrim := cds1.DisableStringTrim;

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

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

代码语言:javascript
复制
  cds2 := cds1;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-22 12:24:40

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

假设您有以下声明:

代码语言:javascript
复制
var
  o1, o2: TObject;
....
o1 := TObject.Create;
o2 := o1;

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

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

代码语言:javascript
复制
cds2.CommandText := cds1.CommandText;

cds1.CommandText的值复制到cds2.CommandText

这完全不同于

代码语言:javascript
复制
cds2 := cds1;

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

在这里可以找到更多关于引用类型和值类型的讨论:Why should we use classes rather than records, or vice versa?

总之,您提出的两个选项所做的事情非常不同。您当前使用的代码(复制属性值)可能有效。在这种情况下,您建议的复制引用的更改肯定不会做您想做的事情。

票数 15
EN

Stack Overflow用户

发布于 2014-07-22 13:02:08

首先:所有组件事件实际上只是引用事件方法的属性,然后这些方法被用作事件处理程序。所以当你把一个事件作为

代码语言:javascript
复制
cds2.AfterApplyUpdates := cds1.AfterApplyUpdates;

您只分配对同一方法的引用。对于事件,这是非常常用的,以避免多次编写相同的代码。

第二,当您将一个对象变量分配给另一个对象变量时,大卫已经很难过了。

代码语言:javascript
复制
cds2 := cds1;

您只将对对象实例的相同引用分配给另一个变量。您没有复制对象的任何实际数据。

第三,即使你的要求会奏效,我也怀疑你是否愿意使用它。为什么?因为这样做,您将得到两个TClientDataSets,将访问相同的数据库。拥有这些只是很有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24887218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档