Почему синтаксис generi c TArray Create отличается от других функций класса? - PullRequest
1 голос
/ 19 марта 2020

Я заметил кое-что, что кажется мне несоответствием в общем синтаксисе c TArray (и сводит меня с ума ...)

Функция "конструктор" должна вызываться указав тип перед именем функции.

MyArray := TArray<Integer>.Create(3, 2, 1);

Другие функции класса необходимо вызывать, указав тип после имени функции

TArray.Sort<Integer>(MyArray);

Есть ли практическая причина, почему они это сделали?

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

Массив generi c определяется следующим образом:

TArray<T> = array of T;

Это псевдоним для массива динамического c. Массивы Dynami c имеют метод intrinsi c Create. Даже не универсальные c единицы.

type
  TMyDynArr = array of Integer;
....
arr := TMyDynArr.Create(0, 1, 2);

Этот Create метод является встроенным компилятором c. Обратите внимание, как он принимает произвольное количество аргументов.

С другой стороны, существует класс TArray с его обобщенным методом c Sort. Это реализовано в RTL. Помните, что TArray никогда не создается, это просто дом для обобщенных c методов класса.

Я предполагаю, что добавление методов к массиву типа Dynami c требует поддержки компилятора, поскольку они являются встроенными c функциями. Но добавить к TArray проще, потому что это делается на уровне RTL, не требуя поддержки компилятора.

Вы ничего не можете сделать, чтобы что-то здесь изменить, поэтому мало что можно извлечь из этого. Вы не можете это изменить. Просто привыкни к этому.

2 голосов
/ 19 марта 2020

Первый TArray - это определение типа системы array of T. Создание также может быть написано так:

MyArray := [3,2,1]; 

Второй TArray - это класс, определенный в Generics.Collections.

Они не имеют ничего общего друг с другом.


Также обратите внимание, что классовый метод TArray с использованием обобщенных имен называется Параметризованные методы .

Type
  TArray = class
    ...
    class procedure Sort<T>(var Values: array of T); overload; static;
    ...
  end; 

Это способ уменьшить дублирование кода.

...