“var”和“out”参数有什么区别?
用var
声明的参数和用out
声明的参数有什么区别? 编译器如何以不同的方式对待它们(例如,通过生成不同的代码,或者更改它发布的诊断信息)? 还是不同的修饰符只允许程序员logging参数的使用目的? 参数的types对此有什么影响?
var
参数将通过引用传递,就是这样。
out
参数也是通过引用传递的,但是假设input值是不相关的。 对于托pipetypes(string,接口等),编译器将通过在例程开始之前清除variables来执行此操作,等同于写入param := nil
。 对于非托pipetypes,编译器实现与var
相同。
请注意,清除托pipe参数是在呼叫站点执行的,因此为该函数生成的代码不会随out
或var
参数而变化。
没有太大的区别,对于编译器来说。 看到梅森的答案 。
在语义上,有一个很大的区别:
-
var
告诉程序员这个例程可以使用它的当前值, - 程序员告诉程序员忽略/放弃当前值。
稍迟一点,但为了logging,我遇到了一个情况, var或out有很大的不同。
我正在处理一个SOAP Web服务,它导出了以下方法:
function GetUser( out User :TUser ) :TResult;
这被导入到C#中相当于
function GetUser( out Result :TResult) :TUser;
当我改变了一个变种 ,它正确地导入。
我猜测,Delphi的SOAP调用者将函数结果视为out参数,并且具有两个out参数会混淆Delphi SOAP例程。 我不确定是否有一种解决方法可以让您使用参数。