调试时如何查看通用数组的名称?

How to see the Generic Array's name while debugging?

我开始使用大量泛型,但现在我发现调试越来越难,要知道实际上开始处理哪个数组。参见示例:

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

但是,在比较之前,这并没有告诉我它是哪个数组的信息。因此,我需要在每次比较后设置断点才能知道哪个是 True。

这些显然不起作用:

Data.Name

TArray<Data>.Name

是否有任何其他方法可以知道我可以在调试器 (Watch) 中看到哪个数组已传递?


Answer/Solution:

对于面临同样问题的任何人,问题:正如雷米在接受的答案中所说的那样,我想要实现的目标是不可能的。好的,现在快速的解决方法是将比较 (Data = DataArr1) 放入 Watch 中,看看哪个解析为 True。不是最好的,但仍然可用,因为现在我们可以看到实际使用的是哪个数组。

代码编译后就没有变量名了。当您调试 WorkOnData() 时,它可以显示的唯一变量名称是 Data,如果不评估您提供的表达式,调试器无法知道 Data 指向什么。所以不行,你问的基本不可能。

您可能需要做的是将您的数组包装在另一个具有 Name 字符串字段的 record 中,然后根据需要传递该记录。当您在调试器中检查它时,您会看到它的 Name 值。