vala是“通过引用传递”还是“通过值传递”?

时间:2015-07-01 14:12:35

标签: parameter-passing vala

或者存在指针和引用,例如 C

我正在尝试使用 vala ,但很高兴知道vala是“通过引用传递”还是“按值传递”

2 个答案:

答案 0 :(得分:5)

首先,您应该了解默认的vala编译器valac编译为C(作为中间语言)。然后使用C编译器(通常为gcc)编译代码。

valac -C example.vala将汇编为example.c

因此,您可以自己检查生成的C代码。

现在回答真正的问题:

Vala同时支持call-by-valuecall-by-reference。它甚至比这更精细。

让我们以一个普通的C数据类型(int)为例。

通话按值:

public void my_func (int value) {
    // ...
}

该值将被复制到该函数中,无论您使用value内的my_func执行什么操作,它都不会影响调用者。

使用ref

按引用进行调用
public void my_func (ref int value) {
    // ...
}

地址将被复制到该功能中。您在value内使用my_func所做的一切也会在来电方面反映出来。

使用out

按引用进行调用
public void my_func (out int value) {
    // ...
}

基本上与ref相同,但在调用my_func之前不必初始化该值。

对于基于GObject的数据类型(非静态类),它会变得更复杂,因为您必须考虑内存管理。

由于总是使用指针(隐含地)管理它们,ref和“out”修饰符现在反映了(隐式)指针的传递方式。

可以说它增加了一个间接层次。

string和数组数据类型也使用指针和自动引用计数(ARC)进行内部管理。

虽然气馁,但Vala也支持指针,因此您可以像C一样拥有int *MyClass *

答案 1 :(得分:1)

从技术上讲,它会传递值,因为底层代码转换为C.简单类型(数字类型,布尔值,枚举,标志)按值传递。字符串通过引用传递,但由于它们是不可变的,因此它们也可以通过值传递。

但是,数组,对象和结构都是使用C中的指针传递的,因此它们通过引用传递。函数参数还有refout修饰符,强制这些参数通过引用传递。