gpt4 book ai didi

delphi - 如何使用记录列表

转载 作者:行者123 更新时间:2023-12-02 13:20:19 24 4
gpt4 key购买 nike

我在方法中有一条记录作为局部变量。然后我将它添加到作为该类成员的 TList 中。现在我的问题是方法完成后,记录仍然有效吗? (或者它被破坏了,我不应该使用 MyList.List[0])。这是示例代码:

TTestClass = class
MyList: TList<TMyRec>;
procedure add;
end;

procedure TTestClass.add;
var
ARec: TMyRec;
begin
Arec.a:= 100;
ARec.b:= 'abc';

MyList.add(ARec);
end;

最佳答案

is the record is still valid?

,但其值(value)是。

记录是在堆栈上分配的值类型,这意味着它们是按值传递的(在每次赋值时复制)

当您像以前那样使用它们时,实际上是在执行从局部变量到列表中存储的隐式复制。

所以不,当方法完成执行时,var block 中声明的记录无效。但它的值已经复制到列表的存储中,因此它是一个有效值。

请考虑以下代码以进行更多说明:

program Project20;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, system.generics.collections;

type
PMyRec = ^TMyRec;
TMyRec = record
a: Integer;
b: string;
end;

TTestClass = class
MyListOfPointers: TList<PMyRec>;
MyListOfValues: TList<TMyRec>;

constructor Create;
destructor Destroy; override;
procedure add;
procedure addP;
procedure ShowRecs;
end;


procedure TTestClass.add;
var
ARec: TMyRec;
begin
Arec.a:= 100;
ARec.b:= 'abc';

MyListOfValues.add(ARec);
end;

procedure TTestClass.addP;
var
ARec: TMyRec;
begin
Arec.a:= 100;
ARec.b:= 'abc';

MyListOfPointers.add(@ARec);
end;

constructor TTestClass.Create;
begin
MyListOfPointers := TList<PMyRec>.Create;
MyListOfValues := TList<TMyRec>.Create;
end;

destructor TTestClass.Destroy;
begin
MyListOfPointers.Free;
MyListOfValues.Free;
inherited;
end;

procedure TTestClass.ShowRecs;
begin
writeln(PMyRec(MyListOfPointers[0])^.b + ' ' + PMyRec(MyListOfPointers[0])^.a.ToString);
writeln(MyListOfValues[0].b + ' ' + MyListOfValues[0].a.ToString);
end;

var
MyClass: TTestClass;

begin
try
MyClass := TTestClass.Create;
try
MyClass.Add;
MyClass.AddP;
MyClass.ShowRecs;

finally
MyClass.Free;
end;

Readln;
except
on E: Exception do
begin
Writeln(E.ClassName, ': ', E.Message);
Readln;
end;
end;
end.

输出为

第一次尝试

39866256
abc 100

第二次尝试

40390544
abc 100

您不会遇到访问冲突,而是会遇到一种独特的行为 a 将在该地址上取任何值,并且 b 将始终为空(b = ''),因为它是托管类型。

关于delphi - 如何使用记录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56099044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com