You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中OUT参数实际行为与官方文档不符的技术问询

Delphi OUT参数:文档表述与实际行为的矛盾

Embarcadero官方文档中说明,OUT参数(默认适用于所有类型)不应作为输入使用,因为其值会被“discarded(丢弃)”。

最初理解“丢弃”指变量原有值会被清除并置零,但实际测试后发现,用“disregarded(忽略)”或“ignored(无视)”来描述更准确。

文档原文指出:

使用out参数时,被引用变量的初始值会被调用的例程丢弃。

但实际测试结果却和文档描述不符,且不同类型的OUT参数行为不一致:

  • Integer类型变量的初始值未被置零
  • string类型变量的初始值被清空
  • 自定义记录类型的初始值也未被清除

测试代码如下:

TYPE TMyRec = record
  i: Integer;
end;

Procedure TestInteger(OUT i: Integer);
Begin
End;

Procedure TestRec(OUT R: TMyRec);
Begin
End;

Procedure TestStr(OUT S: string);
Begin
End;

procedure TfrmTest.btnTestRecClick(Sender: TObject);
begin
  VAR MyRecord: TMyRec;
  MyRecord.i:= 7;
  TestRec(MyRecord);
  Memo.Lines.Add('Test rec: '+ IntToStr(MyRecord.i));
end;

procedure TfrmTest.btnTestStrClick(Sender: TObject);
begin
  VAR s: string:= 'x';
  TestStr(s);
  Memo.Lines.Add('Test str: '+ s);
end;

procedure TfrmTest.btnTestIntClick(Sender: TObject);
begin
  VAR i: Integer:= 7;
  TestInteger(i);
  Memo.Lines.Add('Test int: '+ IntToStr(i));
end;

此外文档还提到:

调用GetInfo过程时,会立即释放MyRecord占用的内存,之后才将程序控制权传递给该过程。

但测试显示记录的内存并未被置零。

由此产生以下疑问:

  • 是文档内容存在错误?
  • 还是措辞表述不当,应该用“忽略”代替“丢弃”?
  • 为何Embarcadero会使用这种易混淆的表述?

更新:另有文章证实,OUT参数的行为不仅文档描述不佳,且存在不一致性:托管类型总会被置空。


内容的提问来源于stack exchange,提问作者Error - CPU Not Foud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:06:09