Похоже, что компилятор Delphi не учитывает const параметров записи, когда задействованы "записи с методами".
Не пытаясь злоупотребить const Соглашение ранее, я был немного удивлен, обнаружив, что компилятор принял такой код:
type
TTest = record
Field : String;
procedure Update;
end;
procedure TTest.Update;
begin
Field := Field + '+1';
end;
procedure DoStuff(const t : TTest);
begin
ShowMessage(t.Field);
t.Update;
ShowMessage(t.Field);
end;
Хотя, если вы попытаетесь сделать t.Field:='doh';
в DoStuff fi, компиляторПравильно жаловаться, но вы можете вызывать методы, которые изменяют запись «const», даже без подсказки или предупреждения.Так что это другое поведение, чем для ссылочных типов (таких как классы или динамические массивы), где прямая запись в поля разрешена (поскольку const ограничивает только изменения самого параметра).
Добавление :это позволяет модифицировать объявленные константы времени компиляции таким же образом, как в:
const
cTest : TTest = (Field : '1');
...
cTest.Update; // will show '1' then '1'+'1'
ShowMessage(cTest.Field); // will show '1' (because optimized at compile-time)
Это допустимое / документированное поведение?или просто недостаток компилятора?