我正在使用 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;
更新
文档中提到:
常量参数可以通过值或引用传递给函数,这取决于使用的特定编译器。要强制编译器通过引用传递常量参数,可以使用带有 const 关键字的 [Ref] 装饰器。
见常量参数
IDE 何时或为何决定插入它?
IDE 永远不会插入这个。它只是复制事件处理程序的声明。编写事件处理程序的人将 pass by
[ref]
erence 标记放在那里。
它对 VCL 应用程序有什么影响吗?
是的。
如果将 8 字节参数标记为 const,它通常会在 x64 中按值传递,在 x86 中按引用传递。
将其声明为
const [ref]
将强制在两种情况下通过引用传递它。const [ref]
被引入之前,我们被迫使用 var
而不是 const
来达到同样的效果。
有些对象在使用此 const [ref] 解决方案时遇到问题。当使用具有这种新样式的 FreeAndNil 时,他们抛出访问被拒绝错误($80070005),同时再次重新初始化这些对象,运行最新的 Win 11 更新。特别是当你想启用像相机这样的硬件时。使用以前的 FreeAndNil 方法时不会发生此问题。