我想在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?",但由于我的问题没有将记录作为参数传递,所以它们似乎无关紧要。
答案 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。