代码之家  ›  专栏  ›  技术社区  ›  Wouter van Nifterick Andrey

Delphi中的命名/可选参数?

  •  11
  • Wouter van Nifterick Andrey  · 技术社区  · 16 年前

    在一个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 回复  |  直到 16 年前
        1
  •  19
  •   Rob Kennedy    16 年前

    显然,Delphi语言支持命名参数,因为它们出现在示例Delphi代码中。Delphi支持自动化对象上的命名参数,这些对象实现 IDispatch 接口。 There are restrictions on the types the parameters and return types can have 特别是,它们不能是Delphi类。

    我不认为从命名参数中寻求的便利性会超过通过 IDispatch.Invoke 方法。呼叫也可能需要使用 GetIDsOfNames 第一。您不会在更多的代码中看到这一点,因为延迟绑定通常是人们试图避免的事情。尽可能使用早期绑定,以避免查找调度ID和间接方法调用的成本。

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

    我认为可选参数被高估了。它们为编写代码的人节省时间,但不为阅读代码的人节省时间。无论是谁读取它,都需要知道任何未指定参数的默认值是什么,所以您也可以直接提供所有的值。

        2
  •  4
  •   Tim Sullivan    16 年前

    如果你这样宣布你的程序:

    procedure DoSomething(AParam : integer = 0);
    

    …如果没有给定参数,它将假定该参数的值为0。我记得,带有默认值的参数必须在调用结束时,如下所示:

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

    不是这样的:

    procedure DoSomething(AParam : integer = 0; ASecondParam : string);
    
        3
  •  4
  •   Gerry Coll    16 年前

    它基本上是“一些针对自动化对象的编译器黑客”。我有时不得不用它来实现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)