现在我们要实现交换2个数的值,由于在程序中经常用到,所以封装到函数中
代码如下
1 /// <summary>
2 /// 交换2个数的值
3 /// </summary>
4 static public void Swap(int x1, int x2)
5 {
6 int temp = x1;
7 x1 = x2;
8 x2 = temp;
9 }
在打印出2个数的值
1 static void Main(string[] args)
2 {
3 int x1 = 10;
4 int x2 = 20;
5 Swap(x1, x2);
6 Console.WriteLine("x1={0},x2={1}", x1, x2);
7 }
结果如下:
x1=10
x2=20
2个数并没有发生变化,原因在于我们传递给函数的是x1,x2的复制品,所以在swap函数内部的复制品的变化,不会影响到main函数的x1,x2的值(值变量做函数的参数时,传递的都是值的复制),如果我们想在函数内部的参数变化直接影响到外部,那么我们就要用到关键字ref(reference--引用)。
现在我们队程序稍作改变:
1 /// <summary>
2 /// 交换2个数的值
3 /// </summary>
4 static public void Swap(ref int x1,ref int x2)
5 {
6 int temp = x1;
7 x1 = x2;
8 x2 = temp;
9 }
在打印出2个数的值:
1 int x1 = 10;
2 int x2 = 20;
3 Swap(ref x1, ref x2);
4 Console.WriteLine("x1={0},x2={1}", x1, x2);
5 Console.ReadKey();
结果如下:
x1=20
x2=10
总结下:
ref与out的主要区别在于,在.net中函数只能有且只有一个返回值,但是有时我们需要函数返回多个返回值,那要怎么办呢?于是out就派上用场了,而out在函数外被赋值也是白搭,就相当于返回值没有必要被赋值一样,它值负责返回数据,out函数在函数中必须被赋值,这就相当于函数的返回值行为很相像。其实他们就是一回事
而ref就是使值变量由传递的副本变为自身,也就是值传递变为引用传递而已...
ref必须先初始化,因为是引用,所以必须先“有”,才能引用,而out则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用。
ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。
案例:两个变量的交换;int.TryParse。
例子:int.TryParse函数
具体代码就不写了