var
声明的参数和声明的参数有什么区别out
?编译器如何区别对待它们(例如,通过生成不同的代码,或通过更改它发出的诊断)?或者不同的修饰符是否仅仅允许程序员记录参数的预期用途?参数的类型对此事有何影响?
问问题
21575 次
3 回答
48
一个var
参数将通过引用传递,就是这样。
参数也通过out
引用传递,但假定输入值无关紧要。对于托管类型(字符串、接口等),编译器将通过在例程开始之前清除变量来强制执行此操作,相当于编写param := nil
. 对于非托管类型,编译器的实现out
方式与var
.
请注意,托管参数的清除是在调用站点执行的,因此为函数生成的代码不会随参数out
或var
参数而变化。
于 2013-01-24T17:38:57.693 回答
11
于 2013-01-25T10:26:21.673 回答
2
有点晚了,但只是为了记录,我遇到了一个案例,其中var或out有很大的不同。
我正在开发一个导出以下方法的 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 回答