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允许您在类上使用它-尽管没有任何效果。