Delphi - System.Copy лучшие практики - PullRequest
3 голосов
/ 22 марта 2012

Насколько мне известно, строки 1 основаны на Delphi, 0 позиция зарезервирована для длины.Я отвечаю за огромное приложение, написанное на D5 и D2006, которое использует функцию копирования путем копирования из индекса 0, и несколько коллег также кодируют таким образом в данный момент.Поскольку это «магическая» функция Delphi, я считаю, что даже если Copy используется для копирования строки из индекса 0, за кулисами она копирует ее из позиции 1.

Для меня хорошей практикой являетсяскопируйте строку с 1-й позиции, а не с 0-й, даже результат будет таким же.

Теперь, мой вопрос, может ли приложение быть затронуто при переходе на другую версию Delphi, используя функцию копирования из 0 позиции вместо того, чтобы использоваться для копирования из 1 позиции?

1 Ответ

2 голосов
/ 22 марта 2012

Delphi RTL игнорирует вас при передаче 0 в качестве параметра Index для Copy для строки.Когда вы передаете 0 или меньше для Index, RTL использует значение 1.Таким образом, то, что вы делаете, является доброкачественным в том смысле, что нет никаких заметных различий в поведении между передачей 1 или любого значения меньше 1. Однако, безусловно, сбивает с толку использование 0 в качестве строкового индекса в Delphi, и я бы рекомендовал не делать этого.

В псевдокоде реализация Copy начинается следующим образом:

function Copy(s: string; Index, Count: Integer): string;
begin
  if Index<1 then
    Index := 1;
  dec(Index);//convert from 1-based to 0-based indexing
  ....continues

На самом деле фактическая реализация немного сложнее, но приведенный выше псевдокод даетправильная семантика.

Ваш комментарий о длине, хранящейся в индексе 0, верен для коротких строк старого стиля.Но это не так для длинных струн.Фактически именно этот факт привел к довольно странной ситуации, когда строки основаны на 1, а динамические массивы, списки и т. Д. Основаны на 0.

...