Delphi: передать по ссылке или передать по значению? - PullRequest
12 голосов
/ 02 октября 2010

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

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

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

Ответы [ 4 ]

23 голосов
/ 02 октября 2010

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

16 голосов
/ 02 октября 2010

В 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 (архивная версия)

7 голосов
/ 02 октября 2010

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

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

4 голосов
/ 02 октября 2010

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

...