在其中一个Delphi演示应用程序中,我偶然发现了一些我不知道Delphi编译器接受的语法:
// ......\Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto\SrvComp\Word\
// Main.pas, line 109
Docs.Add(NewTemplate := True); // note the assignment
我似乎无法重现这种类型的参数传递我自己的代码,我从来没有看到任何人使用它。所以这些是我的问题:
我可以在“普通”方法中使用它并且它是“Delphi语言”的一部分,还是这是一些自动化对象的编译器攻击?
为了能够使用它需要什么?
这类似于C#4的命名和可选参数吗?
其他信息:我通常会通过 记录或简单的课程 有许多可选参数 方法,但看起来我不会 需要用这种语法。我意识到 默认参数值,但他们的 因为你有用是有限的 无法提供任何参数 一个省略的权利。在JavaScript中 我正在使用这个命名参数样式 一直都是(不同的 语法),它很强大。
答案 0 :(得分:19)
显然,Delphi语言支持命名参数,因为它们出现在Delphi代码示例中。 Delphi支持自动化对象上的命名参数,自动化对象是实现IDispatch
接口的对象。 There are restrictions on the types the parameters and return types can have;特别是,它们不能是Delphi类。
我认为,通过IDispatch.Invoke
方法路由每个方法调用,您从命名参数中获取的便利性将超过您所获得的性能。呼叫可能还需要先使用GetIDsOfNames
。你没有在更多的代码中看到这一点,因为后期绑定通常是人们试图避免的。尽可能使用早期绑定,以避免查找调度ID和间接方法调用的成本。
Delphi通过允许默认值支持非自动化代码中的可选参数。只要您省略所有后续参数的实际参数,您就可以省略任何具有默认值的参数的实际参数 - 编译器确保函数的声明允许这样做。
我认为可选参数被高估了。它们为(一)人编写代码节省了时间,但对于(很多)人阅读代码却没有。无论谁在阅读它,都需要知道任何未指定参数的默认值,所以你也可以只是明确地提供所有值。
答案 1 :(得分:5)
如果您声明您的程序如下:
procedure DoSomething(AParam : integer = 0);
...如果没有给出参数,它将假定值为0。我记得,默认值的参数必须在调用结束时,如下所示:
procedure DoSomething(AFirstParam : string; AParam : integer = 0);
不喜欢这样:
procedure DoSomething(AParam : integer = 0; ASecondParam : string);
答案 2 :(得分:4)
它基本上是“自动化对象的一些编译器攻击”。我有时不得不将它用于Excel和Word自动化。
e.g。
MSExcel.Application.Cells.Replace(What:='', Replacement:='', LookAt:=xlPart,
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True);
相当于VBA
Application.Cells.Replace(What='', Replacement='', LookAt=xlPart, _
SearchOrder=xlByRows, MatchCase=False, SearchFormat=True, ReplaceFormat=True)