Ziemlich wurscht. Wenn man einen Rückgabewert hat, sind Funktionen zu bevorzugen, da sie intuitiver sind und genau für diesen Zweck entwickelt wurden. In seltenen Fällen (bei Übergabe großer Strukturen bzw. Strings, etc.) kann ein var
Parameter sinnvoll sein, um Kopieroperationen zu vermeiden. Muss man sich im Normalfall aber keine Gedanken drüber machen.
Da hast du
var
mit
const
verwechselt.
var
ist genau wie (meistens)
const
ein "pass by reference", also stimmt das schon mit der Vermeidung von unnötigen Kopieroperationen. Da ein Output Parameter ja aber gewünscht ist, macht
const
hier keinen Sinn
Zudem verwechselt ihr beide var
mit out
.
Nöö.
var
ist runtergebrochen auf den generierten Code exakt gleichwertig zu
out
(auch wenn out gegebenenfalls aus Gründen der Übersichtlichkeit zu bevorzugen ist).
Code:
005CE2D4 E8BFFFFFFF call Beispiel1 // function
Unit2.pas.48: Beispiel2(X);
005CE2D9 8D45FB lea eax,[ebp-$05]
005CE2DC E8C7FFFFFF call Beispiel2 // procedure mit var
Unit2.pas.49: Beispiel3(X);
005CE2E1 8D45FB lea eax,[ebp-$05]
005CE2E4 E8CFFFFFFF call Beispiel3 // procedure mit out
bei gemanagten Typen ala String, Variant, Interface und dynamischen Arrays macht der Delphi-Compiler aus function Beispiel(...): string;
eben auch einprocedure Beispiel(...; var Result: string);
und kopiert nichts um
Interessant. So viel "Intelligenz" hätte ich dem Delphi Compiler ernsthaft nicht zugetraut. Wieder was gelernt.