11 сентября 2023

Delphi 12. Улучшения для списков, массивов и коллекций

    Среди прочих изменений RTL в Delphi 12 можно выделить доработку функциональных возможностей списков, массивов и коллекций:
  • Новые методы TArray: IndexOf, LastIndexOf, Contains.
  • Новый метод IsEmpty у списков и коллекций.
  • Для TList и его классов-потомков сообщение об ошибке EArgumentOutOfRangeException ("Argument out of range") стало значительно информативнее. Теперь оно включает в себя имя класса, индекс вызвавший ошибку и допустимый диапазон (или тот факт, что структура пуста). Пример демонстрирующий сообщение об ошибке EArgumentOutOfRangeException и использование метода IsEmpty:
    program ListTest;
    
    {$APPTYPE CONSOLE}
    
    uses
      System.SysUtils, System.Generics.Collections;
    
    begin
      var list: TList<Integer> := TList<Integer>.Create;
      if list.IsEmpty then
        Writeln('list is empty');
      try
        Writeln( list[10] );
      except
        on E: Exception do
          Writeln( E.ClassName, ': ', E.Message );
      end;
      try
        list.AddRange( [1, 2, 3, 4, 5, 6, 7, 8, 9] );
        Writeln( list[10] );
      except
        on E: Exception do
          Writeln( E.ClassName, ': ', E.Message );
      end;
    
      list.Free;
    end.
    Результаты его работы в Delphi 11 (без list.IsEmpty) и Delphi 12:
    EArgumentOutOfRangeException в Delphi 11 и Delphi 12
  • В System.Generics.Collections.TArray добавлены перегруженные функции для преобразования списка элементов в строку с указанием формата и разделителей:
    class function ToString<T>(const Values: array of T; const AFormatSettings: TFormatSettings; const ASeparator: string = ','; const ADelim1: string = ''; const ADelim2: string = ''): string; reintroduce; overload; static;
    class function ToString<T>(const Values: array of T; const ASeparator: string = ','; const ADelim1: string = ''; const ADelim2: string = ''): string; reintroduce; overload; static;
  • Все классы и функции System.Generics.Collections, System.Generics.Default и System.Classes.TList для индексов вместо Integer используют NativeInt.
  • У TDictionary изменен способ создания хэш-ключей и улучшены некоторые функции GetHashCode.
  • Оптимизирован метод TSparseArray.Add.
  • Исправлены ошибки:
    • RSP-23842: System.Generics.Collections TArray cannot handle full-size arrays in 64-bit mode
    • RSP-31381: TList<T>.IndexOf/LastIndex of implementation not optimal
    • RSP-37655: Memory leak in TArray.Sort<T>() without comparer
    • RSP-39686: TArray Integer mishmash
    • RSP-40174: TArray.BinarySearch uses linear search in worst case scenario

2 комментария:

  1. Лучше бы работали в сторону ускорения и уменьшения генерируемого кода

    ОтветитьУдалить
    Ответы
    1. Анонимный04 января, 2024 17:47

      Предложите свои услуги. Посмотрим как вы вместе совершите переворот!

      Удалить