2

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

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

请注意,该过程SetMyPersistent还没有到这里,这是下一步进入的地方。我右键单击该对象并选择“光标处的完整类”(或Shift + Control + C)以调用代码完成。当它自动创建此属性设置器时,它会自动将分配代码放入...

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

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

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

如果属性是Stringor之类的类型Integer,则直接赋值是正确的方法。但是在实现 a 的已发布属性时TPersistent,使用它不是正确的方法TPersistent.Assign吗?

使用这两种分配机制的本质区别是什么?因为如果 usingTPersistent.Assign是正确的做法,那么代码补全有一个小缺陷——即假设它FMyPersistent := Value被认为是“错误的”。

4

2 回答 2

3

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

代码完成将相同的代码放入它创建的每个 setter 中。对于在最终将值存储在字段中之前还有额外工作要做的属性,因此字段存储语句是正确的。IDE 不知道您真正想要什么。

于 2013-10-25T01:56:36.933 回答
3

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

于 2013-10-25T02:50:48.383 回答