【问题标题】:How to return array from a Delphi function?如何从 Delphi 函数返回数组?
【发布时间】:2011-05-26 22:40:26
【问题描述】:

我的应用程序中有一个函数需要返回一个数组。我在几个地方找到了如何通过声明数组类型来做到这一点,例如

type
  TStringArray = array of string; 

然后声明我的函数

function SomeFunction(SomeParam: Integer): TStringArray;

我的问题是尝试以同时具有接口和实现的形式进行设置。如何声明我的类型并在接口中使用该类型进行函数声明?

【问题讨论】:

  • “字符串数组”在 Delphi 中通常被认为是“不惯用的”。 TStringList 通常是首选。
  • 我通常使用“DynArray”后缀来命名此类类型定义,以便区分动态数组和静态数组:TStringDynArray = array of string; TStringArray = array[0..(maxInt div sizeof(string))-1] of string; 但没有官方约定。跨度>
  • @Warren P:请注意,作为 XE RTL 一部分的新 FileIO 单元广泛使用 TStringDynArray。所以我不同意这不是惯用的。特别是如果您想返回数组并使用枚举器循环遍历它,这非常方便(参见TDirectory.GetFiles 示例)。
  • @Warren P:还有一点:返回TStringList 更不习惯,因为它违反了“创造者负责破坏”的原则
  • 这个约定的意义何在?我发现for FileName in TDirectory.GetFiles do ...StrList := TStringList.Create; try TDirectory.GetFiles (StrList); for FileName in StrList do ... finally StrList.Free; end; 优雅得多,数组方法有什么缺点吗?否则没有理由不使用它恕我直言

标签: arrays delphi


【解决方案1】:

如果您的 Delphi 相当新,则无需声明新类型,只需将其声明为 TArray<String>

从上面的答案复制并粘贴的示例:

unit Unit1;

interface

function SomeFunction(SomeParam: integer): TArray<String>;

implementation

function SomeFunction(SomeParam: integer): TArray<String>;
begin
  SetLength(result, 3);
  result[0] := 'Alpha';
  result[1] := 'Beta';
  result[2] := 'Gamma';
end;

end.

【讨论】:

  • TArray&lt;T&gt;(以及一般的泛型)并非没有问题,所以要小心。
【解决方案2】:
unit Unit1;

interface

uses SysUtils;

type
  TStringArray = array of string;

function SomeFunction(SomeParam: integer): TStringArray;

...

implementation

function SomeFunction(SomeParam: integer): TStringArray;
begin
  SetLength(result, 3);
  result[0] := 'Alpha';
  result[1] := 'Beta';
  result[2] := 'Gamma';
end;

...

end.

黄金法则是单元的interface 部分描述了单元使用的数据类型,以及驻留在单元中的类型、类和函数(它们的签名)。这是所有其他单位看到的。 implementation 部分包含类和函数的实现。这对其他单位是不可见的。其他单位需要关心的是本单位的接口,本单位与外部单位签订的“合同”,而不是实施部分的“实施细则”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2022-10-01
    • 2012-06-17
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多