“var”和“out”参数之间有什么区别?

时间:2013-01-24 17:34:59

标签: delphi parameters pass-by-reference

使用var声明的参数与使用out声明的参数之间有什么区别?编译器如何区别对待它们(例如,通过生成不同的代码,或通过更改它发出的诊断)?或者,不同的修饰符是否只允许程序员记录参数的预期用途?参数的类型对此有什么影响?

3 个答案:

答案 0 :(得分:44)

var参数将通过引用传递,就是这样。

out参数也通过引用传递,但假设输入值无关紧要。对于托管类型(字符串,接口等),编译器将通过在例程开始之前清除变量来强制执行此操作,相当于编写param := nil。对于非托管类型,编译器将outvar相同地实现。

请注意,清除托管参数是在呼叫站点执行的,因此为该功能生成的代码不会随outvar参数而变化。

答案 1 :(得分:8)

对于编译器来说没有太大区别。请参阅Mason's answer

从语义上讲,存在很大差异:

  • var告诉程序员,例程可以使用其当前值,
  • out告诉程序员,例程将忽略/丢弃其当前值。

答案 2 :(得分:1)

稍晚但仅仅是为了记录,我遇到了 var out 产生重大影响的案例。

我正在开发一个SOAP Web服务,它导出了以下方法:

function GetUser( out User :TUser ) :TResult;

被导入C#,相当于

function GetUser( out Result :TResult) :TUser;

当我将输出更改为 var 时,它正确导入。

我猜测Delphi SOAP调用程序将函数结果视为 out 参数,并且有两个 out 参数会混淆Delphi SOAP例程。我不确定是否有解决方法允许您使用 out 参数。