Я переношу устаревшее приложение Delphi в Delphi-XE2, и мне интересно, есть ли веская причина для замены массивов, определенных как Array of MyType
на TArray<MyType>
. Итак, вопрос в том, каковы преимущества и недостатки использования TArray<T>
вместо массива MyType?
Каковы причины использования TArray <T> вместо массива T?
Ответ 1
Основное преимущество - это менее жесткие правила идентификации типов. Рассмотрим:
a: array of Integer;
b: array of Integer;
Эти две переменные не совместимы с назначением. Ошибка компилятора:
a := b;
С другой стороны, если вы используете общий синтаксис:
a: TArray<Integer>;
b: TArray<Integer>;
то эти две переменные совместимы с назначением.
Конечно, вы можете написать
type
TIntegerArray = array of Integer;
Но все стороны должны соглашаться на один и тот же тип. Это нормально, если весь код находится под вашим контролем, но при использовании кода из разных источников появление родовых динамических массивов имеет огромное значение.
Другим преимуществом, которое возникает в виду, в том же духе, является то, что вы можете легко использовать общий тип массива как возвращаемый тип общего метода.
Без общего массива вы вынуждены объявлять тип этой формы:
TArrayOfT = array of T
в вашем общем классе, что довольно беспорядочно. И если вы пишете общий метод в не-generic-классе, то у вас нет способа сделать это объявление. Опять же общий массив решает проблему.
TMyClass = class
class function Foo<T>: TArray<T>; static;
end;
Все это следует из правил совместимости типов, описанных в документации следующим образом:
Совместимость типов
Два неинтерминированных генерика рассматриваются как присваивание совместимы, только если они идентичны или являются псевдонимами для общий тип.
Рассматриваются два экземпляра, генерируемых в виде экземпляра совместимы, если базовые типы идентичны (или являются псевдонимами для общий тип), и аргументы типа идентичны.
Ответ 2
Вы можете инициализировать TArray<T>
значениями с одной конструкцией:
var
LArray: TArray<Integer>;
begin
LArray := TArray<Integer>.Create(1, 2, 3, 4);
Для array of Integer
вам нужно будет написать гораздо больше кода:
var
LArray: array of Integer;
begin
SetLength(LArray, 4);
LArray[0] := 1;
LArray[1] := 2;
LArray[2] := 3;
LArray[3] := 4;
Ответ 3
Это пригодится для результатов функции.
Пример:
В Delphi не допускается следующее. Здесь вам нужно объявить отдельный тип. Какая пустая трата времени.
function MyFunc:array of integer;
begin
end;
Подождите, дженерики для resque:
function MyFunc:TArray<integer>;
begin
end;