12

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

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

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

我似乎无法在我自己的代码中重现这种类型的参数传递,而且我从未见过有人使用它。所以这些是我的问题:

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

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

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


附加信息:当方法有许多可选参数时,我通常传递记录或简单类,但看起来我不需要这种语法。我知道默认参数值,但它们的用处有限,因为您不能在省略的参数右侧提供任何参数。在 JavaScript 中,我一直在使用这种命名参数样式(无论是使用不同的语法),而且它很强大。

4

3 回答 3

21

显然,Delphi 语言支持命名参数,因为它们出现在 Delphi 示例代码中。Delphi 支持自动化对象上的命名参数,这些对象是实现IDispatch接口的对象。参数和返回类型可以有的类型是有限制的;特别是,它们不能是 Delphi 类。

我认为您从命名参数中寻求的便利不会超过通过该IDispatch.Invoke方法路由每个方法调用所带来的性能损失。一个电话可能也需要先使用GetIDsOfNames。您不会在更多代码中看到这一点,因为后期绑定通常是人们试图避免的事情。尽可能使用早期绑定以避免查找调度 ID 和间接方法调用的成本。

Delphi 通过允许默认值来支持非自动化代码中的可选参数。您可以省略任何具有默认值的参数的实际参数,只要您也省略所有后续参数的实际参数 - 编译器确保函数的声明允许这样做。

我认为可选参数被高估了。它们为(一个)编写代码的人节省了时间,但没有为(许多)阅读代码的人节省时间。阅读它的人都需要知道任何未指定参数的默认值是什么,因此您最好还是明确地提供所有值。

于 2009-05-20T03:44:06.083 回答
6

如果您像这样声明您的程序:

procedure DoSomething(AParam : integer = 0);

...如果未给出参数,它将假定参数值为 0。我记得,具有默认值的参数必须在调用结束时,所以像这样:

procedure DoSomething(AFirstParam : string; AParam : integer = 0);

不是这样的:

procedure DoSomething(AParam : integer = 0; ASecondParam : string);
于 2009-05-20T03:02:20.890 回答
5

它基本上是“自动化对象的一些编译器破解”。我有时不得不将它用于 Excel 和 Word 自动化。

例如

  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)
于 2009-05-20T03:36:39.500 回答