C#基础:引用传递的关键字ref和out
在平时的编码过程中,如果我们需要调用一个函数,对一个变量进行一系列的操作,那么我们可以使用值传递和引用传递两种方法。
下面我举一个简单的例子:
public static void Main(string[] args) { int number = 5; Console.WriteLine("number value= " + number); number = Add(number); Console.WriteLine("After calling Add: " + number); } public static int Add(int a) { return a+1; }
上述代码实现的效果是对一个int类型的变量number进行加一的操作,这个操作是通过值传递实现的,即将number变量传给Add函数,由该函数操作后返回一个int类型的值,再赋值给number,这种方法实际上是复制了一个number,然后对其进行操作,在我们要传递复杂的类或者大型的对象的时候,这个复制的开销就会很大。
因此C#也提供了引用传递的方法,比起值传递,引用传递只需要传递一个指针,对于内存的开销会比较小,以下是使用ref关键字进行引用传递的实现:
1 public static void Main(string[] args) 2 { 3 int number = 5; 4 Console.WriteLine("number value= " + number); 5 6 //引用传递 7 Increment(ref number); 8 Console.WriteLine("After calling Increment: " + number); 9 } 10 static void Increment(ref int value) 11 { 12 value += 1; 13 }
在这个代码中,传递number变量的时候,我们在其前面和形参列表前加上ref,即可表示引用传递,ref关键字有个需要注意的点就是,在传递之前,该对象或者变量需要已经被初始化。
而C#中还有一个out关键字,它不需要初始化,但是它也仍然需要在函数内部被赋值。
以下是out关键字的示例:
public static void Main(string[] args) { int number; Console.WriteLine("Before calling GetNumber: uninitialized"); // 使用 out 参数的方式 GetNumber(out number); Console.WriteLine("After calling GetNumber: " + number); // 使用返回值的方式 number = GetAnotherNumber(); Console.WriteLine("After calling GetAnotherNumber: " + number); } static void GetNumber(out int value) { value = 42; // 必须在方法内部为 out 参数赋值 } public static int GetAnotherNumber() { return 42; }