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

时间:2010-10-02 12:23:14

标签: delphi parameter-passing

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

定义
  • 是否会制作myObject的副本?

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

4 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分: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.

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

也许这篇文章清除了有关在Delphi中将参数传递给函数的不同方法的内容:

Different function parameter modifiers in Delphi(存档版)

答案 2 :(得分:7)

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

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

答案 3 :(得分:4)

通过引用传递对象。