什么是 ref 参数?

写这篇博客之前,本来想把标题写成“ref参数与out参数的区别”,但想了想还是分开写吧,以免更混淆大家。
首先,来看一句比较绕嘴的话
变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上,该怎么处理呢?
你们觉得绕口吗?觉得绕口也没关系,因为看完我下面的讲解,你再理解这句话就会容易很多了。

接着进入文章正题部分:
首先,我在控制台上写一个方法,方法的功能就是交换传入的数值,代码如下

static void TestRef(int a,int b)
{
    int temp;
    temp = b;
    b = a;
    a = temp;
}

然后在 Main 函数里声明两个int类型的变量x,y,然后调用 TestRef () 方法。为做直观的对比,这里我把交换x,y前和交换x,y后都在控制台上打印出来,代码如下

static void Main(string[] args)
{
    int x = 10;
    int y = 20;
    Console.WriteLine("交换之前,x={0},y={1}",x,y);
    TestRef(x,y);
    Console.WriteLine("交换之后,x={0},y={1}",x,y);
    Console.ReadKey();
}

按F5启动项目,如下
在这里插入图片描述
我们明明调用了可以交换传入数值位置的函数 TestRef,为什么却没有交换 x 和 y 的位置呢?
首先,函数本身没有问题,问题在于 int 是值类型,它所创建的实例不在托管堆中分配内存,而是直接存储在变量中。虽然我们调用了函数 TestRef,但也不过只是复制了一遍x,y的值而已。那我们想在调用完交换函数 TestRef 后,x,y的位置可以交换,该怎么做呢?

这就要引入关键字 ref
ref (全拼:reference):强制要求参数按引用传值。
使用 ref 关键字 有两个注意事项
Num_1:传入参数之前,必须给参数赋值。
Num_2:调用方法时,必须加 ref 关键字

验证Num_1:
现在假如我们不给 x 赋初始值,会有什么问题呢?
在这里插入图片描述
验证Num_2:
我们在函数 TestRef里参数类型前面加上 ref 关键字

static void TestRef(ref int a,ref int b)
{
    int temp;
    temp = b;
    b = a;
    a = temp;
}

然后直接调用这个函数会有什么问题呢?
在这里插入图片描述
以上两个验证便是使用 ref 关键字需要注意的事项。
在调用函数里加上ref关键字后
在这里插入图片描述
我们再按F5,看有什么不一样的效果
在这里插入图片描述
OK。x,y交换位置成功.
现在再回头看那句绕嘴的话,变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上(用 ref 关键字啊,哈哈),现在应该很容易理解了吧!
如果还有不懂的,可以在评论里说下,我这边看到后就会给你回复。
如果你喜欢这篇博客,觉得它讲的还不错,转载请注出处。谢谢
2018年12月20日14:38:44

猜你喜欢

转载自blog.csdn.net/qq_42351033/article/details/85121688
ref