使用var
声明的参数与使用out
声明的参数之间有什么区别?编译器如何区别对待它们(例如,通过生成不同的代码,或通过更改它发出的诊断)?或者,不同的修饰符是否只允许程序员记录参数的预期用途?参数的类型对此有什么影响?
答案 0 :(得分:44)
var
参数将通过引用传递,就是这样。
out
参数也通过引用传递,但假设输入值无关紧要。对于托管类型(字符串,接口等),编译器将通过在例程开始之前清除变量来强制执行此操作,相当于编写param := nil
。对于非托管类型,编译器将out
与var
相同地实现。
请注意,清除托管参数是在呼叫站点执行的,因此为该功能生成的代码不会随out
或var
参数而变化。
答案 1 :(得分:8)
答案 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 参数。