const
для параметров в Delphi по существу означает «я не собираюсь изменять это», , и мне также все равно, будет ли это передано по значению или по ссылке - в зависимости от того, что наиболее эффективно, меня устраивает". Жирная часть важна, потому что она на самом деле наблюдаема. Рассмотрим этот код:
type TFoo =
record
x: integer;
//dummy: array[1..10] of integer;
end;
procedure Foo(var x1: TFoo; const x2: TFoo);
begin
WriteLn(x1.x);
WriteLn(x2.x);
Inc(x1.x);
WriteLn;
WriteLn(x1.x);
WriteLn(x2.x);
end;
var
x: TFoo;
begin
Foo(x, x);
ReadLn;
end.
Хитрость в том, что мы передаем одну и ту же переменную как var
, так и const
, чтобы наша функция могла мутировать через один аргумент и посмотреть, влияет ли это на другой. Если вы попробуете это с кодом выше, вы увидите, что увеличение x1.x
внутри Foo
не изменит x2.x
, поэтому x2
было передано по значению. Но попробуйте раскомментировать объявление массива в TFoo
, чтобы его размер стал больше, и запустите его снова - и вы увидите, как x2.x
теперь псевдоним x1.x
, поэтому у нас есть переход по ссылке для x2
сейчас
Подводя итог, const
всегда является наиболее эффективным способом передачи параметра любого типа, но вы не должны делать никаких предположений о том, есть ли у вас копия значения, которое было передано вызывающей стороной, или ссылка в какое-либо (потенциально мутировавшее с помощью другого кода, который вы можете вызвать) местоположение.