ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该中。简单点说就是,使用了ref和的效果就几乎和C中使用了一样。它能够让你直接对原数进行操作,而不是对那个原数的Copy进行操作。 还是以例子来说明吧; 1. ref: int i =0; 有函数fun(ref i)和fun(i) 它们的函数体都是{ i = 3;},那么在执行以下两段代码后: (1)int i = 0; fun(i); System.Console.WriteLine(i.ToString()); (2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString()); (1)的输出是1,(2)的输出是3, 2. out: int i; //注意,这里只是声明了变量i,并没有对其初始化 有函数fun(ref i)、fun(out i)和fun(i) 它们的函数体都是{ i = 3;},那么在执行以下三段代码后: (1)int i = 0; fun(i); System.Console.WriteLine(i.ToString()); (2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString()); (3)int i = 0; fun(out i); System.Console.WriteLine(i.ToString()); (1)和(2)在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“i” 而(3)能正常编译,而且输出3 最后总结一下: Ref和Out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。稍有不同之处是: 使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须在方法中对其完成初始化。 使用Ref和Out时都必须注意,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。 Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候。 列举一个例子
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace Test.OutAndRef{ public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int i1 = 0; int i11= fun1(i1); System.Console.WriteLine(i1.ToString() + fun1(i1)); int i2 = 0; int i22 = fun2(ref i2); System.Console.WriteLine(i2.ToString() + fun2(ref i2)); int i3; int i33 = fun3(out i3); System.Console.WriteLine(i3.ToString() + fun3(out i3)); } public int fun1(int num) { num = 3; return ++num; } public int fun2(ref int num) { num = 3; return num++; } public int fun3(out int num) { num = 3; return num++; } }}