[ref]在VCL应用程序中做了什么?

时间:2016-04-29 14:06:18

标签: delphi parameter-passing pass-by-reference custom-attributes

我正在使用Delphi 10 Seattle处理VCL应用程序,并且当我注意到Delphi为Ref参数添加了Rect自定义属性时,通过IDE创建了一个TDBGrid事件处理程序:

procedure TfrmXxx.yyyDrawColumnCell(Sender: TObject;
  const [Ref] Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  //
end;
  • IDE何时或为何决定插入此内容?
  • 在VCL应用中有效吗?

更新

以下是无法重现行为的视频: enter image description here

1 个答案:

答案 0 :(得分:6)

在文档中提到:

  

常量参数可以通过值或引用传递给函数,具体取决于所使用的特定编译器。要强制编译器通过引用传递常量参数,可以将[Ref]装饰器与const关键字一起使用。

请参阅Constant Parameters

  

IDE何时或为何决定插入此内容?

IDE永远不会插入它。它只是复制事件处理程序的声明。编写事件处理程序的人将[ref]符号标记放在那里。

  

在VCL应用中有效吗?

是。
如果将8字节参数标记为const,它通常会在x64中通过值传递,并在x86中通过引用传递 在两种情况下,将其声明为const [ref]将强制它通过引用传递 在进行内联汇编和多线程代码时非常有用 在引入const [ref]之前,我们被迫使用var代替const来达到同样的效果。