我开始使用很多泛型,但现在我发现越来越难调试,知道哪个数组实际上是开始处理的。请参阅示例:
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;
因此,我可以通过比较来识别数组以获得真/假:
Data = DataArr1
但是,在比较之前,这并没有给我信息它是哪个数组。因此,我需要在每次比较后放置断点,以了解哪个断点为 True。
这些显然不起作用:
Data.Name
TArray<Data>.Name
还有其他方法可以知道我可以在调试器(Watch)中看到的已传递的数组吗?
答案/解决方案:
对于任何面临同样问题的人,问题:正如雷米在公认的答案中所说,我想实现的目标是不可能的。好的,现在快速的解决方法是将比较(Data = DataArr1
)放入Watch中,看看哪一个解析为True。不是最好的,但仍然可用,因为现在我们可以看到实际正在使用哪个数组。
编译代码后就没有变量名称了。 当你调试WorkOnData()
时,它唯一可以显示的变量名是Data
,并且调试器如果不计算你提供的表达式,就无法知道Data
指向什么。 所以不,你所要求的基本上是不可能的。
您可能要做的是将数组包装在另一个具有Name
字符串字段的record
中,然后根据需要传递该记录。在调试器中检查它时,会看到其Name
值。