Vala编程语言高级特性-参数方向
参数方向
Vala 中的方法可以传递零个或多个参数。调用方法时的默认行为如下:
任何值类型参数都会被复制到方法执行时的本地位置。
任何引用类型参数不会被复制,而是只传递它们的引用给方法。
这种行为可以通过修饰符 ref
和 out
来改变。
从调用者角度看:
out
:你可以传递一个未初始化的变量给方法,并期望在方法返回后它会被初始化。ref
:你传递给方法的变量必须已经初始化,方法可能会改变它也可能不会。
从被调用者角度看:
out
:参数被认为是未初始化的,你必须初始化它。ref
:参数被认为是已初始化的,你可以改变它也可以不改变。
void method_1(int a, out int b, ref int c) { ... }
void method_2(Object o, out Object p, ref Object q) { ... }
这些方法可以如下调用:
int a = 1;
int b;
int c = 3;
method_1(a, out b, ref c);Object o = new Object();
Object p;
Object q = new Object();
method_2(o, out p, ref q);
每个变量的处理方式如下:
"a" 是值类型。该值将被复制到方法本地的新内存位置,因此对它的更改对调用者不可见。
"b" 也是值类型,但作为 out 参数传递。在这种情况下,值不会被复制,而是将数据的指针传递给方法,因此对方法参数的任何更改对调用代码都是可见的。
"c" 的处理方式与 "b" 相同,唯一的区别是方法所表明的意图。
"o" 是引用类型。方法被传递与调用者拥有的相同对象的引用。因此,方法可以更改该对象,但如果它重新赋值给参数,该更改对调用者不可见。
"p" 是相同类型,但作为 out 参数传递。这意味着方法将接收到指向对象引用的指针。因此,它可以用对另一个对象的引用替换该引用,当方法返回时,调用者将拥有对另一个对象的引用。当你使用这种类型的参数时,如果你没有给参数分配新的引用,它将被设置为 null。
"q" 再次是相同类型。这种情况的处理类似于 "p",但重要的区别是方法可以选择不更改引用,并且可以访问所引用的对象。Vala 将确保在这种情况下 "q" 实际引用某个对象,而不是设置为 null。
以下是如何实现 method_1() 的示例:
void method_1(int a, out int b, ref int c) {b = a + c;c = 3;
}
当设置 out 参数 "b" 的值时,Vala 将确保 "b" 不为 null。因此,如果你不关心这个值,可以安全地将 null 作为 method_1() 的第二个参数传递。