Delphi:将对象内容复制到另一个实例中

Delphi:将对象内容复制到另一个实例中,delphi,Delphi,将具有简单字段(字符串、整数、布尔值)的对象的内容复制到另一个实例中的最快方法是什么 Type TMyClass = packed class a: string; b: string; c: Integer; end; Var z,x: TMyClass; begin z := TMyClass.Create; x := TMyClass.Create; z.a := 'test'; z.c := 20; // copy z into x captio

将具有简单字段(字符串、整数、布尔值)的对象的内容复制到另一个实例中的最快方法是什么

Type TMyClass = packed class
  a: string;
  b: string;
  c: Integer;
end;

Var z,x: TMyClass;
begin
  z := TMyClass.Create;
  x := TMyClass.Create;
  z.a := 'test';
  z.c := 20;

  // copy z into x

  caption := x.a;
  x.free;
  z.free;

t持久性
的设计考虑到了这一点,它也是
t组件
的基类。更具体地说,是它的
Assign
方法,您将负责覆盖该方法以进行复制

例如

type
  TMyClass = class(TPersistent)
  private
    FSomething: String;
  public
    procedure Assign(Source: TPersistent); override;
  end;

procedure TMyClass.Assign(Source: TPersistent);
var
  S: TMyClass;
begin
  if Source is TMyClass then begin
    S:= TMyClass(Source);
    FSomething:= S.FSomething;

    //and everything else

  end else
    inherited; //Will fail on purpose
end;
注意:上面的代码是快速的,未经测试,但这就是它的想法

然后,你可以复制一份像

MyNewInstance.Assign(MyOldInstance);

我的想法更像是直接在对象的内存中复制/写入。@hikari不一定,不。记录就是这样工作的。但当涉及到对象时,它更复杂。你可以像我描述的那样推出你自己的等效方法,但你仍然需要在某个地方显式地完成赋值。@hikari:一般来说这是不可能的。考虑引用类型成员,例如字符串、动态数组、指向动态分配内存的指针等。您需要编写自己的深度复制例程。正如Jerry指出的,
Assign
方法是一个很好的选择。然而,对于上面的例子,将
is
as
结合起来是没有必要的。在
is
测试之后,您可以使用简单的
TMyClass(Source)
cast——否则您将执行相同的测试两次(或者21次,如果您有20个成员)。更清楚地说,字符串是指针,即使它们是记录字段。如果记录包含字符串,编译器会安排副本,但不会复制内存块。如果有的话,它的性能差别很小。然后手动分配字段。什么是压缩类?@SertacAkyuz我也很困惑,这是记录的问题,但显然,Delphi允许您在类上使用它-尽管没有任何效果。