C#中既可以通过值传递参数,也可以通过引用传递参数。通过引用传递参数,允许方法内成员改变参数的值,并保持更改。若要通过引用传递参数,可以使用ref和out关键字。ref和out的功能相当于C中的指针。
ref和out都可以使参数按引用方式传递,但两者有一定的区别。
1.ref传递参数时必须先初始化,而out传递参数时不需要事先初始化,但必须在方法中初始化。
2.out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
3.使用ref和out,在使用和定义方法时,参数之前都必须使用ref或out参数,对应起来。
具体看下面示例:
static void Main(string[] args)
{
int i = 3;
TestRef(ref i);
Console.WriteLine("执行ref后的值" + i.ToString());
int j;
TestOut(out j);
Console.WriteLine("执行out后的值" + j.ToString());
Console.Read();
}
static void TestRef(ref int i)
{
Console.WriteLine("参数自增前的值" + i.ToString());
i++;
Console.WriteLine("参数自增后的值" + i.ToString());
}
static void TestOut(out int j)
{
j = 1;
Console.WriteLine("参数自增前的值" + j.ToString());
j++;
Console.WriteLine("参数自增后的值" + j.ToString());
}
{
int i = 3;
TestRef(ref i);
Console.WriteLine("执行ref后的值" + i.ToString());
int j;
TestOut(out j);
Console.WriteLine("执行out后的值" + j.ToString());
Console.Read();
}
static void TestRef(ref int i)
{
Console.WriteLine("参数自增前的值" + i.ToString());
i++;
Console.WriteLine("参数自增后的值" + i.ToString());
}
static void TestOut(out int j)
{
j = 1;
Console.WriteLine("参数自增前的值" + j.ToString());
j++;
Console.WriteLine("参数自增后的值" + j.ToString());
}
执行结果:
从上面结果我们可以看出,ref和out都是按地址传递的方式。