记录类型(或数组)的前向声明

时间:2015-09-29 16:16:49

标签: delphi delphi-xe5

我想在XE5中这样做:

type
  TMyRec = record
    // fields
    class function GetList: TMyRecArr; static;
  end;

  TMyRecArr = array of TMyRec;

我已经看过"Forward declarations for record types""how to do a typed forward declaration?",但由于我的问题没有将记录作为参数传递,所以它们似乎无关紧要。

3 个答案:

答案 0 :(得分:17)

您不能使用前向声明来声明记录类型或数组类型。但不要害怕。您可以使用通用动态数组TArray<T>

type
  TMyRec = record
    class function GetList: TArray<TMyRec>; static;
  end;

这实际上比根据您问题中的代码声明TMyRecArr更好。这是因为通用TArray<T>具有比传统动态数组类型更灵活的类型标识。您可以将TArray<T>与在独立且不知道您的代码的库中定义的泛型类型一起使用。

现在,您可以声明类似的类型:

type
  TMyRec = record
    type TMyRecArray = array of TMyRec;
    class function GetList: TMyRecArray; static;
  end;

然后您的数组类型为TMyRec.TMyRecArray。但我劝你不要这样做。您将拥有一个只能与您的代码一起使用的类型,并且不能与第三方代码一起使用。

总之,TArray<T>是您的朋友。

答案 1 :(得分:1)

由于在类型定义之前允许声明指针类型,稍微修改一下您的功能,您可以这样做:

type
  PMyRecArr = ^TMyRecArr;

  TMyRec = record
    // fields
    class procedure GetList(const arr: PMyRecArr); static;
  end;

  TMyRecArr = array of TMyRec;

程序实施及其用法如下:

class procedure TMyRec.GetList(const arr: PMyRecArr);
begin
  SetLength(arr^, 4);
end;

var
  arr: TMyRecArr;

begin
  TMyRec.GetList(@arr);
  Writeln(Length(arr));//prints 4
end.

答案 2 :(得分:0)

好吧,我搜索了一下,发现我可以使用助手来做到这一点:

type
  TMyRec = record
    // fields
  end;

  TMyRecArr = array of TMyRec;

  TMyRecHelper = record helper for TMyRec
    class function GetList: TMyRecArr; static;
  end;

大卫在答案和评论中提到它缺乏泛型的好处,但它并没有使代码自动完成无法使用!我的意思是可以得出这样的结论:TArray<T>提供的灵活性在某些代码中是不需要的。然后它只不过是increment in memory usage of the final running application or possibly lower performance