Delphi: передавать по ссылке или передавать по значению?

В Delphi, если у меня есть простой класс myClass, и я передаю его экземпляр функции с myFunction( myClass ), которая определяется function myFunction( myObject : myClass ) : Boolean...

  • Будет ли выполнена копия myObject?

  • Когда я вызываю методы myObject в myFunction, будет ли изменен и изменен исходный объект?

Ответ 1

Объекты передаются по ссылке. Копия не будет сделана; будет только один экземпляр класса, только один объект. Исходный объект - это все, что есть.

Ответ 2

В Delphi объекты являются специальными указателями, которые относятся к структуре данных в кучевой памяти. Когда вы передаете объект функции, вы фактически передаете указатель, а не копию всех данных объекта. В этом случае, когда вы измените поле или свойство с помощью этой ссылки, это повлияет на исходные данные объекта. Вот простой пример, демонстрирующий это поведение:

program ObjParamTest;

type
  TMyClass = class
  private
    FMyField : Integer;
  public
    property MyField : Integer read FMyField write FMyField;
  end;


function ModifyObject(AnObj: TMyClass);
begin
  AnObj.MyField := AnObj.MyField + 1;
end;  

var
  MyObj : TMyClass;
begin
  MyObj := TMyClass.Create;
  try
    AnObj.MyField := 2;
    Writeln(AnObj.MyField); // ==> Prints 2
    ModifyObject(MyObj);
    Writeln(AnObj.MyField); // ==> Prints 3
  finally
    MyObj.Free;
  end;
end.

Также обратите внимание: модификаторы параметров (например, Var, Const, Out) изменяют способ передачи объектной ссылки на функцию и не влияют на исходную структуру данных.

Возможно, в этой статье вы узнаете о различных способах передачи параметров в Delphi для вас больше:

Различные модификаторы параметров функции в Delphi (архивная версия)

Ответ 3

Там немного больше, чем "объекты передаются по ссылке". Объекты являются ссылочными типами, поэтому по умолчанию они всегда передаются по ссылке. Любая объектная переменная является ссылкой на объект.

Но если вы передадите объектную переменную "по ссылке" (в параметр var), то, если вы замените объект другим объектом внутри процедуры, в которую вы его передали, вы будете в конце концов с другим объектом, как только возвращается процедура. Будьте осторожны при этом; это может привести к утечке памяти, если вы измените единственную ссылку, которую вы имеете на определенный объект.

Ответ 4

Объекты передаются по ссылке.