12 Stimmen

Benannte/optionale Parameter in Delphi?

In einer der Delphi-Demoanwendungen bin ich über eine Syntax gestolpert, von der ich nicht wusste, dass der Delphi-Compiler sie akzeptiert:

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

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

Ich kann diese Art der Parameterübergabe in meinem eigenen Code nicht nachvollziehen, und ich sehe auch niemanden, der sie verwendet. Dies sind also meine Fragen:

  • Kann ich dies in "normalen" Methoden verwenden und ist es Teil der "Delphi-Sprache", oder ist dies einige Compiler-Hack für Automatisierung Objekte?

  • Was ist erforderlich, um dies zu nutzen?

  • Ist dies etwas wie die benannten und optionalen Parameter von C#4?


Zusätzliche Informationen: Ich übergebe normalerweise Datensätze oder einfache Klassen, wenn es viele optionale Parameter für Methoden gibt, aber es sieht so aus, als würde ich mit dieser Syntax nicht nötig. Ich bin mir bewusst von Standard-Parameterwerten, aber ihre Nützlichkeit ist begrenzt, weil man keine Parameter rechts neben einem rechts von einem ausgelassenen Parameter. In JavaScript verwende ich diesen Stil der benannten Parameter die ganze Zeit (sei es mit verschiedenen Syntax), und es ist mächtig.

21voto

Rob Kennedy Punkte 158781

Es ist klar, dass Delphi benannte Parameter unterstützt, da sie in dem Delphi-Beispielcode direkt erscheinen. Delphi unterstützt benannte Parameter bei Automatisierungsobjekten, d. h. bei Objekten, die die IDispatch Schnittstelle. Es gibt Einschränkungen bezüglich der Typen, die Parameter und Rückgabetypen haben können ; insbesondere können sie keine Delphi-Klassen sein.

Ich glaube nicht, dass die Bequemlichkeit, die Sie von benannten Parametern erwarten, den Leistungseinbruch aufwiegt, den Sie erleiden würden, wenn jeder Methodenaufruf durch die IDispatch.Invoke Methode. Ein Aufruf muss möglicherweise auch die GetIDsOfNames erstens. Sie sehen dies nicht in mehr Code, weil späte Bindung ist in der Regel etwas, das Menschen versuchen, zu vermeiden. Verwenden Sie die frühe Bindung, wann immer möglich, um die Kosten für die Suche nach Dispatch-IDs und indirekte Methodenaufrufe zu vermeiden.

Delphi unterstützt optionale Parameter in nicht-automatisiertem Code, indem es Standardwerte zulässt. Sie können die aktuellen Parameter für jeden Parameter mit einem Standardwert weglassen, solange Sie auch die aktuellen Parameter aller nachfolgenden Parameter weglassen - der Compiler stellt sicher, dass die Deklaration einer Funktion dies zulässt.

Ich halte optionale Parameter für überbewertet. Sie sparen Zeit für die (eine) Person, die den Code schreibt, aber nicht für die (vielen) Leute, die den Code lesen. Derjenige, der den Code liest, muss wissen, welche Standardwerte für nicht spezifizierte Parameter gelten, also kann man genauso gut alle Werte explizit angeben.

6voto

Tim Sullivan Punkte 16549

Wenn Sie Ihr Verfahren wie folgt deklarieren:

procedure DoSomething(AParam : integer = 0);

... es wird der Wert 0 für den Parameter angenommen, wenn er nicht angegeben wird. Wenn ich mich recht erinnere, müssen Parameter mit Standardwerten am Ende des Aufrufs stehen, also etwa so:

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

nicht so:

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

5voto

Gerry Coll Punkte 5827

Es handelt sich im Grunde um einen "Compiler-Hack für Automatisierungsobjekte". Ich muss es manchmal für die Automatisierung von Excel und Word verwenden.

z.B..

  MSExcel.Application.Cells.Replace(What:='', Replacement:='', LookAt:=xlPart,
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True);

Ist gleichwertig mit VBA

Application.Cells.Replace(What='', Replacement='', LookAt=xlPart, _
   SearchOrder=xlByRows, MatchCase=False, SearchFormat=True, ReplaceFormat=True)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X