调试时如何查看泛型数组的名称?



我开始使用很多泛型,但现在我发现越来越难调试,知道哪个数组实际上是开始处理的。请参阅示例:

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值。

最新更新