我开始使用大量的泛型,但现在我发现调试越来越难,知道哪个数组实际上已经开始工作了。见例:
Type
TData = record
DataID:integer;
DataName:string;
end;
var DataArr1,DataArr2,DataArr3:TArray<TData>;
procedure WorkOnData(Data:TArray<TData>);
begin
if Data = DataArr1 then // <-- PARKING HERE ON DEBUG I CAN SEE ARRAY DATA, BUT NOT WHICH ARRAY IT IS
ProcessA(DataArr1)
else if Data = DataArr2 then
ProcessB(DataArr2)
else if Data = DataArr3 then
ProcessC(DataArr3);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Sender = Button1 then
WorkOnData(DataArr1)
else if Sender = Button2 then
WorkOnData(DataArr2)
else if Sender = Button3 then
WorkOnData(DataArr3);
end;
所以,我可以通过比较来识别数组以获得True / False:
Data = DataArr1
但是,在比较之前,这并没有告诉我它是哪个数组。所以,我需要在每次比较后放置断点,以了解哪一个是真的。
这些显然不起作用:
Data.Name
TArray<Data>.Name
有没有其他方法可以知道我在调试器(Watch)中看到的传递了哪个数组?
答案/溶液:
对于任何面临同样问题的人,问题是:正如雷米在接受的答案中所说,我想要实现的目标是不可能的。好的,现在快速的解决方法是将比较(Data = DataArr1
)放入Watch并查看哪一个解析为True。不是最好的,但仍然可以使用,因为现在我们可以看到实际使用的是哪个数组。
答案 0 :(得分:3)
编译代码后没有变量名称。调试WorkOnData()
时,它可以显示的唯一变量名是Data
,调试器无法在不评估您提供的表达式的情况下知道Data
指向的是什么。所以不,你所要求的基本上是不可能的。
您可能需要做的是将数组包装在具有record
字符串字段的另一个Name
内,然后根据需要传递该记录。在调试器中检查它时,您会看到其Name
值。