Delphi构造函数通过引用参数

时间:2017-02-23 16:53:58

标签: delphi

我有一个看起来像这样的课程:

type
 TLogin = class(TThread)
  private
   //variables...
  protected
   procedure Execute; override;
  public
   constructor Create(testo: TLabel; splash: TRectangle; username: string; labels: LabelArray);
 end;

我知道构造函数可以使用无穷无尽的数字或参数,但我总是喜欢有一点数量,我猜4是最大值。我已设法使用LabelArray减少参数数量。

type
 LabelArray = array of TLabel;

它的长度为15-22(在运行时决定),我想知道这段代码是否正确(查看var):

constructor Create(testo: TLabel; splash: TRectangle; username: string; var labels: LabelArray);

这有意义吗?当然代码编译但我不确定数组是否已经通过引用传递。我不想复制,因为那样没用;我打算在我的数组中更改那些标签的文本,所以我更喜欢传递引用。

这是一个在与GUI分离的线程中运行的类,因此我在某个点调用Queue来更新主窗体的标签文本。这将是

Queue(nil, procedure
           begin
            FLabelArray[0].Text := '...';
            FLabelArray[1].Text := '...'; //and so on
           end);

因此我觉得副本没用。

2 个答案:

答案 0 :(得分:4)

Delphi动态数组是引用类型。使用var传递数组无法完成任何操作,因为构造函数实际上并未为labels参数指定新值。没有传递动态数组的方法会导致创建副本

您的构造函数只需使用简单的赋值语句将labels参数分配给FLabelArray字段就足够了:

FLabelArray := labels;

这会增加数组的引用计数,因此它将在您刚刚构造的线程对象的生命周期内保持有效数组。

答案 1 :(得分:3)

动态数组是引用计数的,因此如果您通过值或引用传递它,在这种情况下它并不重要。即使你传递副本,数组也会保存对象指针,这些指针很轻,可以复制。您的Queue()来电仍会在原始TLabel个对象上运行。