我有一个看起来像这样的课程:
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);
因此我觉得副本没用。
答案 0 :(得分:4)
Delphi动态数组是引用类型。使用var
传递数组无法完成任何操作,因为构造函数实际上并未为labels
参数指定新值。没有传递动态数组的方法会导致创建副本。
您的构造函数只需使用简单的赋值语句将labels
参数分配给FLabelArray
字段就足够了:
FLabelArray := labels;
这会增加数组的引用计数,因此它将在您刚刚构造的线程对象的生命周期内保持有效数组。
答案 1 :(得分:3)
动态数组是引用计数的,因此如果您通过值或引用传递它,在这种情况下它并不重要。即使你传递副本,数组也会保存对象指针,这些指针很轻,可以复制。您的Queue()
来电仍会在原始TLabel
个对象上运行。