Что делают различные записи типов элементов в TypeData для динамических массивов? - PullRequest
1 голос
/ 03 декабря 2011

Поле TTypeData, содержащее RTTI для разных типов данных, имеет три разных значения типа элемента для динамического массива:

elType: PPTypeInfo;       // nil if type does not require cleanup
elType2: PPTypeInfo;      // independent of cleanup
DynArrElType: PPTypeInfo; // actual element type, even if dynamic array

Цель elType довольно ясна: она используется FinalizeArray в RTL и оставляет nil , если нечего завершать. Но тогда у нас есть два других элемента, elType2 и DynArrElType. Кто-нибудь знает, почему их два и в чем разница между ними?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Только может ответить на вопрос о elType2, потому что это единственное, что я использовал в прошлом, это поле для хранения типа элемента массива.проверьте этот пример

{$APPTYPE CONSOLE}

uses
  TypInfo,
  SysUtils;

type
 TDateArray = array of TDateTime;
Var
  p      : PPTypeInfo;
begin
  try
     p:=TypInfo.GetTypeData(TypeInfo(TDateArray)).elType2;
     Writeln(TypInfo.GetTypeName(p^));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Это вернет TDateTime, который является типом элементов типа TDateArray.

Кстати, поле DynArrElType было заменено в последних версияхДельфы от DynUnitName: ShortStringBase

0 голосов
/ 03 декабря 2011

Насколько я могу судить, elType2 и DynArrElType не используются RTL ни для чего. Компилятор может выдавать эти значения просто как дополнительные метаданные, например, для генераторов документации и т. П.

...