Delphi中的命名/可选参数?

时间:2009-05-20 02:50:58

标签: delphi optional-parameters named-parameters

在其中一个Delphi演示应用程序中,我偶然发现了一些我不知道Delphi编译器接受的语法:

// ......\Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto\SrvComp\Word\    
// Main.pas, line 109

Docs.Add(NewTemplate := True); // note the assignment

我似乎无法重现这种类型的参数传递我自己的代码,我从来没有看到任何人使用它。所以这些是我的问题:

  • 我可以在“普通”方法中使用它并且它是“Delphi语言”的一部分,还是这是一些自动化对象的编译器攻击?

  • 为了能够使用它需要什么?

  • 这类似于C#4的命名和可选参数吗?


  

其他信息:我通常会通过   记录或简单的课程   有许多可选参数   方法,但看起来我不会   需要用这种语法。我意识到   默认参数值,但他们的   因为你有用是有限的   无法提供任何参数   一个省略的权利。在JavaScript中   我正在使用这个命名参数样式   一直都是(不同的   语法),它很强大。

3 个答案:

答案 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)