C#值类型与引用类型

有些最基本的概念,长时间不去结合实际去总结思考,总会有点茫然。

现在就记录下晨会同事聊到的基本概念:

在C#语言中,方法的参数传递默认是按值传递的。当然,使用一些关键字可以改变这种参数传递行为,例如使用ref/out关键字可以使方法参数按引用传递。
但是一提到值、引用这样的字眼,很多人都会立马想到值类型和引用类型。而这也是一个常见的误区:把方法参数传递的概念和类型的概念搞混。

这两种概念是不同的,默认情况下无论是值类型还是引用类型参数都是按照值来传递的,而使用了ref/out参数时,值类型也可以按照引用来传递。

所以值类型既可以按值传递,也可以按引用传递(而且不存在装箱的问题);引用类型既可以按值传递,也可以按引用传递。
这一部分就来聊聊方法参数的传递机制吧。

 

值类型按值传递

方法的参数传递默认是按值传递的,值类型变量按值传递给方法简单的说就是传递一份值类型变量的拷贝给方法。在声明方法时,会默认为参数分配一块新的内存空间用来保存参数的拷贝。
因此,方法内对参数的修改不会影响最初的值。

 

引用类型按值传递

同样,默认情况下引用类型的参数也是按值传递的。所以,和值类型变量按值传递类似,引用类型变量按值传递同样是将变量的拷贝给方法。

回忆一下前文的内容,引用类型变量的值是什么呢?对,是对一个对象的引用。所以我们可以在方法内修改引用类型参数所引用的对象,但是在方法内对参数的修改同样不会影响最初的。即我们无法在方法内部改变原来的引用类型变量对对象的引用。

 

值类型按引用传递

按引用传递参数,简单的说并非传递变量的值,而是传递对变量的引用,同时方法内操作的也不是变量的值,而是通过引用直接操作变量本身。因此方法内部不会再为参数分配一块内存空间,相反,方法会直接操作变量所在的那块内存空间。

 

引用类型按引用传递

方法中的参数值修改,会影响带方法外的值,因为引用类型的“值”,也就是引用,操作的是同一个内存空间。

posted @ 2017-03-29 14:17  Eric-Lee  阅读(358)  评论(0编辑  收藏  举报