已发布的持久属性 - 我应该使用FMyPersistent.Assign(Value)还是FMyPersistent:= Value?

时间:2013-10-25 00:15:42

标签: delphi properties delphi-xe2 variable-assignment

当我构建自定义组件时,我可能会实现已发布的持久属性。例如......

type
  TMyComponent = class(TComponent)
  private
    FMyPersistent: TMyPersistent;    
    ...
  public
    ...
  published
    property MyPersistent: TMyPersistent read FMyPersistent write SetMyPersistent;
    ...
  end;

请注意,过程SetMyPersistent尚未到位,这就是下一步的来源。我右键单击此对象并选择“Cursor完成类”(或Shift + Control + C)以调用代码完成。当它自动创建此属性设置器时,它会自动将赋值代码放入...

procedure TMyComponent.SetMyPersistent(const Value: TMyPersistent);
begin
  FMyPersistent := Value;
end;

现在很高兴它继续为我完成了这项任务。但是,在正常情况下,我一直习惯于使用......

procedure TMyComponent.SetMyPersistent(const Value: TMyPersistent);
begin
  FMyPersistent.Assign(Value);
end;

如果属性类型为StringInteger,则直接分配是正确的方法。但是,在实施TPersistent的已发布属性时,使用TPersistent.Assign不是正确的方法吗?

使用这两种分配机制之间的本质区别是什么?因为如果使用TPersistent.Assign是合适的事情,那么代码完成有一个小缺陷 - 也就是说,假设FMyPersistent := Value被认为是“错误的”。

2 个答案:

答案 0 :(得分:3)

致电Assign。这就是为什么你首先拥有一个属性设置器。如果你要直接覆盖该字段,则不需要setter。覆盖它会泄漏您在构造函数中创建的原始对象。在Object Inspector中修改属性时,您还会注意到IDE中的访问冲突。

代码完成将相同的代码放在它创建的每个setter中。对于在最终将值存储在字段中之前需要执行其他工作的属性,因此field-storage语句是正确的。 IDE不知道你真正想要的是什么。

答案 1 :(得分:3)

你应该问自己的问题是 - 谁拥有涉及的对象?如果您的组件创建并拥有FMyPersistent,请使用FMyPersistent.Assign(Value)将值从Value复制到FPersistent。如果FMyPersistent仅指向其他人拥有的外部对象,则改为使用FMyPersistent := Value