我已经读过SO,开放数组参数会自动通过引用传递。这对于类和字符串是一样的,还是我必须使用var?
我指的是我想通过引用传递给函数(或过程)一个参数。就像在C ++中一样,我总是传递std :: string&例如,它是明确的,否则我传递副本
答案 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);
对于ByValue
和ConstParam
,引用会直接传递。两者之间的区别在于,在ConstParam
的实现中,无法修改引用。它可以在ByValue
。调用者无法看到该修改。当然,您始终可以调用obj
上修改对象状态的方法。在实践中,使用const
作为参考类型没什么意义。
对于VarParam
和OutParam
,传递引用的地址。因此,该过程接收指向该对象的指针的指针。所有指针处理都对您隐藏。但这是允许您修改引用并让调用者看到该修改的原因。
字符串也是引用类型,因此处理类似。