web-dev-qa-db-fra.com

Quelles sont les raisons d'utiliser TArray <T> au lieu de Array of T?

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?

31
Salvador

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.

33
David Heffernan

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;
19
Linas

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;
5