打开数组参数,类和字符串是通过引用传递的吗?

时间:2017-05-10 11:09:06

标签: delphi

我已经读过SO,开放数组参数会自动通过引用传递。这对于类和字符串是一样的,还是我必须使用var?

我指的是我想通过引用传递给函数(或过程)一个参数。就像在C ++中一样,我总是传递std :: string&例如,它是明确的,否则我传递副本

1 个答案:

答案 0 :(得分:7)

您关于打开数组的说法不正确。打开数组参数有三种形式:

procedure ByValue(arr: array of Integer);
procedure ConstParam(const arr: array of Integer);
procedure VarParam(var arr: array of Integer);

最后两个表单var和const传递对数组的引用。但是,第一个传递值传递副本。如果要避免复制,则应使用var或const参数。根据您是否希望修改调用者的数组来选择这些。

对于类和字符串,这些类型是引用类型。由于它们已经是引用,当您将其传递给过程时,您将传递引用。

让我们看看课程的各种可能性:

procedure ByValue(obj: TObject);
procedure ConstParam(const obj: TObject);
procedure VarParam(var obj: TObject);
procedure OutParam(out obj: TObject);

对于ByValueConstParam,引用会直接传递。两者之间的区别在于,在ConstParam的实现中,无法修改引用。它可以在ByValue。调用者无法看到该修改。当然,您始终可以调用obj上修改对象状态的方法。在实践中,使用const作为参考类型没什么意义。

对于VarParamOutParam,传递引用的地址。因此,该过程接收指向该对象的指针的指针。所有指针处理都对您隐藏。但这是允许您修改引用并让调用者看到该修改的原因。

字符串也是引用类型,因此处理类似。