delphi - full - ¿Cuáles son las razones para usar TArray<T> en lugar de Array of T?
delphi berlin (3)
Estoy migrando una aplicación Delphi heredada a Delphi-XE2, y me pregunto si hay una buena razón para reemplazar las matrices definidas como Array of MyType
a TArray<MyType>
. Entonces, la pregunta es: ¿cuáles son los pros y los contras del TArray<T>
de TArray<T>
lugar de Array of MyType?
La principal ventaja es reglas de identidad tipo menos onerosas. Considerar:
a: array of Integer;
b: array of Integer;
Estas dos variables no son compatibles con la asignación. Es un error del compilador escribir:
a := b;
Por otro lado, si usa la sintaxis genérica:
a: TArray<Integer>;
b: TArray<Integer>;
entonces estas dos variables son compatibles con la asignación.
Claro, puedes escribir
type
TIntegerArray = array of Integer;
Pero todas las partes deben ponerse de acuerdo sobre el mismo tipo. Está bien si todo el código está bajo su control, pero cuando se usa código de una variedad de fuentes, la llegada de las matrices dinámicas genéricas hace una gran diferencia.
La otra ventaja que le viene a la mente, de manera similar, es que puede usar fácilmente el tipo de matriz genérica como el tipo de devolución de un método genérico.
Sin la matriz genérica, se le obliga a declarar un tipo de esta forma:
TArrayOfT = array of T
en tu clase genérica, que es bastante desordenada. Y si está escribiendo un método genérico en una clase no genérica, entonces no tiene forma de hacer esa declaración. De nuevo, la matriz genérica resuelve el problema.
TMyClass = class
class function Foo<T>: TArray<T>; static;
end;
Todo esto sigue de las reglas de compatibilidad de tipo descritas en la documentation como esta:
Tipo de compatibilidad
Dos genéricos no instanciados se consideran compatibles con la asignación solo si son idénticos o son alias para un tipo común.
Dos genéricos instanciados se consideran compatibles con la asignación si los tipos de base son idénticos (o son alias a un tipo común) y los argumentos de tipo son idénticos.
Puede inicializar TArray<T>
con valores con una construcción:
var
LArray: TArray<Integer>;
begin
LArray := TArray<Integer>.Create(1, 2, 3, 4);
Para una array of Integer
, necesitarás escribir mucho más código:
var
LArray: array of Integer;
begin
SetLength(LArray, 4);
LArray[0] := 1;
LArray[1] := 2;
LArray[2] := 3;
LArray[3] := 4;
Resulta útil para los resultados de las funciones.
Ejemplo:
Lo siguiente no está permitido en Delphi. Debes declarar un tipo diferente aquí. Que perdida de tiempo.
function MyFunc:array of integer;
begin
end;
Espera, genéricos al resque:
function MyFunc:TArray<integer>;
begin
end;