我有一个看起来像这样的课程:
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 回答
动态数组是引用计数的,因此如果您通过值或引用传递它,在这种情况下并不重要 . 即使你传递副本,数组也会保存对象指针,这些指针很轻,可以复制 . 您的
Queue()
调用仍将在原始TLabel
对象上运行 .Delphi动态数组是引用类型 . 使用
var
传递数组不会't accomplish anything because your constructor isn' t实际为labels
参数分配新值 . 没有传递动态数组的方法会导致创建副本 .构造函数使用简单的赋值语句将
labels
参数分配给FLabelArray
字段就足够了:这会增加数组的引用计数,因此它将在您刚刚构造的线程对象的生命周期内保持有效数组 .