Keep on going never give up.

Let's Go

C# 学习笔记(54)参数传递问题剖析

C#Lonely2019-06-05 13:26:1397次0条

在默认情况下,C#方法中的参数传递都是按值进行的,但实际上参数传递的方式共有4种不同的情况,它们分别为:

● 值类型参数的按值传递

● 引用类型参数的按值传递

● 值类型参数的按引用传递

● 引用类型的按引用传递


值类型参数的按值传递

参数可分为形参和实参两类,形参指的是被调用方法中的参数,也就是说方法定义中的参数为形参;实参指的是调用方法时,传递给对应参数的值。对于值类型的按值传递,传递的是该值类型实例的一个副本,也就是说形参接收到的是实参的一个副本,被调用方法操作的是实参的一个副本罢了。所以此时,方法中对参数的改变不会影响到实参的值。


引用类型参数按值传递

当传递的参数是引用类型时,传递和操作的目标是指向对象的地址,而传递的实际内容是对地址的复制由于地址指向的是实参的值,当方法对地址进行操作时,实际上操作了地址所指向的值,所以调用方法后原来实参的值就会被修改。虽然string类型也是引用类型,然而在按值传递时,会有一种特殊情况就是传递的参数不会因方法中形参的改变而被修改。造成这个特殊性的原因是string类型具有不可变性


值类型和引用类型参数的按引用传递

不管是值类型还是引用类型,使用refout关键字可以实现参数按引用传递。在按引用进行传递时,方法的定义和调用都必须显式地使用ref或out关键字。在按引用传递时,不管参数是值类型还是引用类型,其本质都是一样的,都是通过ref或out关键字来告诉编译器,方法传递的是参数地址,而非参数本身

在值类型参数按引用传递的过程中,传递的是值类型变量的地址,当方法对值类型变量的地址进行操作时,实现的是对值类型变量的实际数据的操作,所以改变了实参中的值。其效果类似于引用类型的按值传递。不同的是,值类型参数按引用传递的地址是栈上值类型变量的地址,而引用类型按值传递的地址是变量所指向的托管堆中实际数据的地址。

在引用类型参数按引用传递的过程中,传递的是引用类型变量的地址,该地址是变量在栈上的地址,即传递的是引用的引用,而不是引用本身。




暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!