德尔福:通过引用或通过值传递?

Sam*_*ral 12 delphi parameter-passing

在Delphi中,如果我有一个简单的类myClass,我将它的一个实例传递给一个函数myFunction( myClass ),由function myFunction( myObject : myClass ) : Boolean... 定义

  • 是否会制作myObject的副本?

  • 当我在myFunction中调用myObject的方法时,原始对象是否也会受到影响和修改?

And*_*and 23

对象通过引用传递.不会制作副本; 只有一个实例,只有一个对象.原始对象就是全部.

  • 是的,原始对象就是堆上的所有对象.但你确实得到了参考文献的**副本**,除非你通过引用传递.在这种情况下,您将获得对对象的引用的引用. (7认同)

vcl*_*per 16

在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.
Run Code Online (Sandbox Code Playgroud)

另请注意,参数修饰符(例如Var,Const,Out)仅更改对象引用传递给函数的方式,并且不会影响原始数据结构.

也许这篇文章清除了有关在Delphi中为函数传递参数的不同方法的更多信息:

Delphi中不同的函数参数修饰符(存档版本)

  • 很棒的链接文章! (3认同)

Mas*_*ler 7

它比"通过引用传递对象"更多.对象是引用类型,因此默认情况下它们总是通过引用传递.任何对象变量都是对象引用.

但是如果你通过"引用"传递一个对象变量(对一个var参数),那么如果用你传递给它的例程中的另一个对象替换该对象,那么一旦例程返回,你将得到一个不同的对象. .这样做时要小心; 如果您更改对某个对象的唯一引用,它可能会导致内存泄漏.

  • 当你说"用不同的对象替换对象"时,你的意思是"用*引用*替换另一个对象来替换对象*引用*".您不能用另一个对象替换对象,但可以覆盖所有想要的引用. (3认同)

Eug*_*its 5

对象通过引用传递。