const记录参数的[Ref]属性是否有用?

时间:2016-12-02 09:58:01

标签: delphi delphi-10.1-berlin

使用最新的Delphi版本(柏林/ 10.1 / 24),[Ref]属性真的有必要吗?

我问这个是因为online doc说:

  

常量参数可以通过值或通过传递给函数   引用,取决于使用的特定编译器。迫使   编译器通过引用传递一个常量参数,可以使用   [ref] decorator与const关键字。

2 个答案:

答案 0 :(得分:8)

它几乎与文档中描述的一样。如果您有理由强制通过引用传递参数,则可以使用[ref]。我能想到的一个例子是互操作。想象一下,您正在调用一个定义如下的API函数:

typedef struct {
    int foo;
} INFO;

int DoStuff(const INFO *lpInfo);

在Pascal中你可能希望像这样导入它:

type
  TInfo = record
    foo: Integer;
  end;

function DoStuff(const Info: TInfo): Integer; cdecl; external libname;

但由于TInfo很小,编译器可能会选择按值传递结构。因此,您可以使用[ref]进行批注,以强制编译器将参数作为参考传递。

function DoStuff(const [ref] Info: TInfo): Integer; cdecl; external libname;

答案 1 :(得分:0)

另一个示例是SysUtils.pas中Delphi 10.4中新的FreeAndNil过程声明,该声明现在最终确保FreeAndNil仅可使用TObject后代。在以前的Delphi版本中,即使没有任何意义,您也可以将任何内容传递给此函数。