或者存在像C那样的指针和引用吗?
我正在尝试开始使用vala,但是了解一下vala是“按引用传递”还是“按值传递”会很有帮助。
或者存在像C那样的指针和引用吗?
我正在尝试开始使用vala,但是了解一下vala是“按引用传递”还是“按值传递”会很有帮助。
valac
会将代码编译成 C 语言(作为中间语言),然后再使用 C 编译器(通常使用 gcc
)编译代码。
valac -C example.vala
将编译成 example.c
所以,你可以自己检查生成的 C 代码。
现在到了真正的问题:
Vala 支持 按值调用
和 按引用调用
。它甚至更加精细。
我们来看一个使用普通 C 数据类型(int)的例子:
按值调用:
public void my_func (int value) {
// ...
}
无论您在my_func
内部对value
做了什么,都不会影响调用者,因为该值将被复制到函数中。
使用 ref
进行引用传递:
public void my_func (ref int value) {
// ...
}
该地址将被复制到函数中。在my_func
内部对value
所做的任何操作都将反映在调用方上。
使用out
进行按引用调用:
public void my_func (out int value) {
// ...
}
ref
相同,但在调用my_func
之前不必初始化值。GObject
的数据类型(非静态类),情况变得更加复杂,因为您必须考虑内存管理。ref
和`out´修饰符现在反映了(隐式)指针的传递方式。string
和数组数据类型也是使用指针和自动引用计数(ARC)进行内部管理。int *
或MyClass *
。从技术上讲,由于底层代码被转换为C,因此它是按值传递的。简单类型(数字类型、布尔类型、枚举和标志)按值传递。字符串按引用传递,但由于它们是不可变的,它们也可以按值传递。
然而,在C中,数组、对象和结构体都使用指针传递,因此它们是按引用传递的。还有ref
和out
修饰符,用于将函数参数强制按引用传递。