Comment retourner un tableau à partir d'un Delphi fonction?
J'ai une fonction dans mon application qui doit retourner un tableau. J'ai trouvé dans quelques endroits comment faire cela en déclarant le type du tableau, par exemple
type
TStringArray = array of string;
Et ensuite déclarer ma fonction
function SomeFunction(SomeParam: Integer): TStringArray;
Mon problème est d'essayer de mettre cela dans une forme qui est à la fois l'interface et la mise en œuvre. Comment dois-je déclarer mon type et avoir une déclaration de fonction de ce type dans l'interface ?
- "Array de string" est généralement considéré comme "non idiomatique" en Delphi. TStringList est généralement préférée.
- J'ai l'habitude d'utiliser le "DynArray" suffixe pour nommer ce type de définition, afin de faire une distinction entre une dynamique et un tableau statique:
TStringDynArray = array of string; TStringArray = array[0..(maxInt div sizeof(string))-1] of string;
Mais il n'existe pas de convention à ce sujet. - P: à Noter que la nouvelle
FileIO
unité utilise qui fait partie de la XE RTL utiliseTStringDynArray
largement. Donc, je ne suis pas d'accord qu'il n'est pas idiomatique. Surtout si vous souhaitez retourner un tableau et une boucle à l'aide d'un agent recenseur c'est très pratique (voirTDirectory.GetFiles
pour un exemple). - P: Un point de plus: de retour d'un
TStringList
est encore moins idiomatiques, dans la mesure où il viole le "créateur est responsable de la destruction" principe - Généralement, j'aimerais passer dans une liste de chaînes au lieu de cela, Smasher. Cela signifie que je voudrais écrire
SomeFunction(other_parameters; outData:TStringList):Boolean;
ouSomeProcedure(other_parameters; outData:TStringList);
. Il n'est également pas idiomatiques pour retourner un objet alloué, comme vous le dites. Donc, ne pas. - Qui utilise FileIO? Celui qui a écrit cela va à l'encontre d'une convention observée presque partout ailleurs dans le RTL et la VCL.
- Quel est le point de cette convention? Je trouve
for FileName in TDirectory.GetFiles do ...
tellement plus élégant queStrList := TStringList.Create; try TDirectory.GetFiles (StrList); for FileName in StrList do ... finally StrList.Free; end;
Sont les inconvénients de la matrice approche? Autrement il n'y a aucune raison de ne pas l'utiliser à mon humble avis - BTW: je parlais de
IOUtils
bien sûr
Vous devez vous connecter pour publier un commentaire.
La règle d'or est que le
interface
section d'une unité décrit les types de données utilisés par l'unité, ainsi que les types, classes et fonctions (leurs signatures) qui résident dans l'unité. C'est ce que tous autres unités de voir. Leimplementation
section contient la mise en œuvre des classes et de fonctions. Ce n'est pas visible pour les autres unités. D'autres unités ont besoin de soins au sujet de l'interface de l'unité, le "contrat" signé par cette unité et l'unité extérieure, et non pas les "détails de mise en œuvre" qui se trouve dans la section mise en œuvre.Si vous Delphi est assez récent, vous n'avez pas besoin de déclarer un nouveau type, en déclarant comme
TArray<String>
.Exemple copié et collé à partir de la réponse ci-dessus:
TArray<T>
(et les Génériques en général) n'est pas sans quelques problèmes, donc être prudent avec elle.