zhzhqiu

方法传递参数ref out说明

ref参数

通过值传送变量是默认的,也可以迫使值参数通过引用传送给方法。为此,要使用ref关键字。如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所作的任何改变都会影响原来对象的值:

static void SomeFunction(int[] ints, ref int i)

{

   ints[0] = 100;

   i = 100;       //the change to i will persist after SomeFunction() exits

}

在调用该方法时,还需要添加ref关键字:

SomeFunction(ints, ref i);

在C#中添加ref关键字等同于在C++中使用&语法指定按引用传递参数。但是,C#在调用方法时要求使用ref关键字,使操作更明确(因此有助于防止错误)。

最后,C#仍要求对传递给方法的参数进行初始化,理解这一点也是非常重要的。在传递给方法之前,无论是按值传递,还是按引用传递,都必须初始化变量。

 

 

out关键字


在C风格的语言中,函数能从一个例程中输出多个值,这种情况很常见。这是使用输出参数实现的——方法是把输出值赋给通过引用传递给方法的变量。通常,变量通过引用传送的初值是不重要的,这些值会被函数重写,函数甚至从来没有使用过它们。

如果可以在C#中使用这种约定,就会非常方便。但C#要求变量在被引用前必须用一个初值进行初始化。在把输入变量传递给函数前,可以用没有意义的值初始化它们,函数将使用真实、有意义的值初始化它们,这样做是没有必要的,有时甚至会引起混乱。但有一种方法能够简化C#编译器所坚持的输入参数的初始化。

编译器使用out关键字来初始化。当在方法的输入参数前面加上out关键字时,传递给该方法的变量可以不初始化。该变量通过引用传送,所以在从被调用的方法中返回时,方法对该变量进行的任何改变都会保留下来。在调用该方法时,还需要使用out关键字,这正如在定义该方法时一样:

static void SomeFunction(out int i)

{

   i = 100;

}

 

public static int Main()

{

   int i; // note how i is declared but not initialized

   SomeFunction(out i);

   Console.WriteLine(i);

   return 0;

}

out关键字是C#中的新增内容,在VB和C++中没有对应的关键字,该关键字的引入使C#更安全,更不容易出错。如果在函数体中没有给out参数分配一个值,该方法就不能编译。


 

posted on 2009-02-16 15:23  网乐者  阅读(237)  评论(0)    收藏  举报

导航