58

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

4

3 回答 3

48

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

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

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

于 2013-01-24T17:38:57.693 回答
11

对于编译器来说,没有太大区别。请参阅梅森的答案

从语义上讲,有很大的不同:

  • var告诉程序员例程可以使用它的当前值,
  • out告诉程序员例程将忽略/丢弃其当前值。
于 2013-01-25T10:26:21.673 回答
2

有点晚了,但只是为了记录,我遇到了一个案例,其中varout有很大的不同。

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

function GetUser( out User :TUser ) :TResult;

它被导入到 C# 中,相当于

function GetUser( out Result :TResult) :TUser;

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

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

于 2014-02-20T17:17:26.350 回答