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

问题描述 投票:0回答:2

我正在使用 Delphi 10 Seattle 开发 VCL 应用程序,并通过 IDE 创建了一个 TDBGrid 事件处理程序,当时我注意到 Delphi 为

Ref
参数添加了一个
Rect
自定义属性:

procedure TfrmXxx.yyyDrawColumnCell(Sender: TObject;
  const [Ref] Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  //
end;
  • IDE 何时或为何决定插入它?
  • 它对 VCL 应用程序有什么影响吗?

更新

对于那些无法重现该行为的人,这是一个视频:

delphi parameter-passing pass-by-reference custom-attributes
2个回答
6
投票

文档中提到:

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

常量参数

IDE 何时或为何决定插入它?

IDE 永远不会插入这个。它只是复制事件处理程序的声明。编写事件处理程序的人将 pass by

[ref]
erence 标记放在那里。

它对 VCL 应用程序有什么影响吗?

是的。
如果将 8 字节参数标记为 const,它通常会在 x64 中按值传递,在 x86 中按引用传递。
将其声明为

const [ref]
将强制在两种情况下通过引用传递它。
这在进行内联汇编和多线程代码时非常有用。
const [ref]
被引入之前,我们被迫使用
var
而不是
const
来达到同样的效果。


0
投票

有些对象在使用此 const [ref] 解决方案时遇到问题。当使用具有这种新样式的 FreeAndNil 时,他们抛出访问被拒绝错误($80070005),同时再次重新初始化这些对象,运行最新的 Win 11 更新。特别是当你想启用像相机这样的硬件时。使用以前的 FreeAndNil 方法时不会发生此问题。

© www.soinside.com 2019 - 2024. All rights reserved.