如何在调试时查看通用阵列的名称?

时间:2016-03-08 01:52:43

标签: arrays delphi generics delphi-xe7

我开始使用大量的泛型,但现在我发现调试越来越难,知道哪个数组实际上已经开始工作了。见例:

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。不是最好的,但仍然可以使用,因为现在我们可以看到实际使用的是哪个数组。

1 个答案:

答案 0 :(得分:3)

编译代码后没有变量名称。调试WorkOnData()时,它可以显示的唯一变量名是Data,调试器无法在不评估您提供的表达式的情况下知道Data指向的是什么。所以不,你所要求的基本上是不可能的。

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