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

var声明的参数和用out声明的参数有什么区别? 编译器如何以不同的方式对待它们(例如,通过生成不同的代码,或者更改它发布的诊断信息)? 还是不同的修饰符只允许程序员logging参数的使用目的? 参数的types对此有什么影响?

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

out参数也是通过引用传递的,但是假设input值是不相关的。 对于托pipetypes(string,接口等),编译器将通过在例程开始之前清除variables来执行此操作,等同于写入param := nil 。 对于非托pipetypes,编译器实现与var相同。

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

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

在语义上,有一个很大的区别:

  • var告诉程序员这个例程可以使用它的当前值,
  • 程序员告诉程序员忽略/放弃当前值。

稍迟一点,但为了logging,我遇到了一个情况, varout有很大的不同。

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

 function GetUser( out User :TUser ) :TResult; 

这被导入到C#中相当于

 function GetUser( out Result :TResult) :TUser; 

当我改变一个变种 ,它正确地导入。

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