[C#]浅析ref、out参数
按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事,再把值类型和引用类型给参杂进来的话就变得更加让人头晕了。 经常看到有人把按引用传递和引用类型混为一谈,让我有点不吐不快。再加上前两天碰到的一个有意思的问题,让我更加觉得应该整理整理关于ref和out的内容了。 一、 什么是按引用传递 ref和out用起来还是非常简单的,就是在普通的按值传递的参数前加个ref或者out就行,方法定义和调用的时候都得加。 ref和out都是表示按引用传递,CLR也完全不区分ref还是out,所以下文就直接以ref为例来进行说明。 大家都知道,按值传递的参数在方法内部不管怎么改变,方法外的变量都不会受到影响,这从学C语言时候就听老师说过的了。 在C语言里想要写一个Swap方法该怎么做?用指针咯。 那么在C#里该怎么做?虽然也可以用指针,但是更通常也更安全的做法就是用ref咯。 说到这里,有一点需要明确,按值传递的参数到底会不会被改变。 如果传的是int参数,方法外的变量肯定是完完全全不变的咯,可是如果传的是个List呢?方法内部对这个List的所有增删改都会反映到方法外头,方法外查一下Count就能看出来了是吧。 那么传List的这个情况,也代表了所有引用类型参数的情况,方法外的变量到底变没变? 不要听信某些论调说什么“引用类型就是传引用”