Подтвердить что ты не робот

Каковы причины использования TArray <T> вместо массива T?

Я переношу устаревшее приложение Delphi в Delphi-XE2, и мне интересно, есть ли веская причина для замены массивов, определенных как Array of MyType на TArray<MyType>. Итак, вопрос в том, каковы преимущества и недостатки использования TArray<T> вместо массива MyType?

4b9b3361

Ответ 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;