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
相关产品推荐
相关产品推荐

