Je migre une application Delphi héritée vers Delphi-XE2 et je me demande s'il y a une bonne raison de remplacer les tableaux définis comme Array of MyType
à TArray<MyType>
. La question est donc de savoir quels sont les avantages et les inconvénients de TArray<T>
utilisation au lieu du tableau de MyType?
Le principal avantage réside dans les règles d'identité de type moins onéreuses. Considérer:
a: array of Integer;
b: array of Integer;
Ces deux variables ne sont pas compatibles avec les affectations. C'est une erreur du compilateur d'écrire:
a := b;
En revanche si vous utilisez la syntaxe générique:
a: TArray<Integer>;
b: TArray<Integer>;
alors ces deux variables sont compatibles d'affectation.
Bien sûr, vous pouvez écrire
type
TIntegerArray = array of Integer;
Mais toutes les parties doivent s'entendre sur le même type. C'est bien si tout le code est sous votre contrôle, mais lorsque vous utilisez du code provenant de diverses sources, l'avènement de tableaux dynamiques génériques fait une énorme différence.
L'autre avantage qui vient à l'esprit, dans la même veine, est que vous pouvez facilement utiliser le type de tableau générique comme type de retour d'une méthode générique.
Sans le tableau générique, vous êtes obligé de déclarer un type de ce formulaire:
TArrayOfT = array of T
dans votre classe générique, ce qui est plutôt désordonné. Et si vous écrivez une méthode générique dans une classe non générique, vous n'avez aucun moyen de faire cette déclaration. Encore une fois, le tableau générique résout le problème.
TMyClass = class
class function Foo<T>: TArray<T>; static;
end;
Tout cela découle des règles de compatibilité de type décrites dans la documentation comme ceci:
Compatibilité des types
Deux génériques non instanciés sont considérés comme compatibles par affectation uniquement s'ils sont identiques ou sont des alias d'un type commun.
Deux génériques instanciés sont considérés comme compatibles d'affectation si les types de base sont identiques (ou sont des alias d'un type commun) et les arguments de type sont identiques.
Vous pouvez initialiser TArray<T>
avec des valeurs avec une construction:
var
LArray: TArray<Integer>;
begin
LArray := TArray<Integer>.Create(1, 2, 3, 4);
Pour array of Integer
vous auriez besoin d'écrire beaucoup plus de code:
var
LArray: array of Integer;
begin
SetLength(LArray, 4);
LArray[0] := 1;
LArray[1] := 2;
LArray[2] := 3;
LArray[3] := 4;
Il est utile pour les résultats de la fonction.
Exemple:
Ce qui suit n'est pas autorisé dans Delphi. Vous devez déclarer un type distinct ici. Quelle perte de temps.
function MyFunc:array of integer;
begin
end;
Attendez, génériques à la resque:
function MyFunc:TArray<integer>;
begin
end;