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

Raf*_*ssi 7 delphi

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

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

Dav*_*nan 7

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

procedure ByValue(arr: array of Integer);
procedure ConstParam(const arr: array of Integer);
procedure VarParam(var arr: array of Integer);
Run Code Online (Sandbox Code Playgroud)

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

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

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

procedure ByValue(obj: TObject);
procedure ConstParam(const obj: TObject);
procedure VarParam(var obj: TObject);
procedure OutParam(out obj: TObject);
Run Code Online (Sandbox Code Playgroud)

对于ByValueConstParam,引用直接传递.两者的区别在于,在执行时ConstParam,无法修改引用.它可以ByValue.调用者无法看到该修改.当然,您总是可以调用方法obj来修改对象的状态.在实践中,使用const参考类型没什么意义.

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

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