首页 文章

Delphi构造函数通过引用参数

提问于
浏览
0

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

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 回答

  • 4

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

  • 3

    Delphi动态数组是引用类型 . 使用 var 传递数组不会't accomplish anything because your constructor isn' t实际为 labels 参数分配新值 . 没有传递动态数组的方法会导致创建副本 .

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

    FLabelArray := labels;
    

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

相关问题