C#中参数的传递方式详解

值类型参数按值传递 class Program { static void Main(string[] args) { int a = 10; Add(a); Console.WriteLine("传递之后的值为:" + a); Console.ReadKey(); } private static void Add(int i) { Console.WriteLine("传递之前的值为:" + i); i = i + 10; } }

结果:

可见,值类型参数在被方法调用的时候,是对本身实例的拷贝和操作,在方法调用前后参数值不变。

引用类型参数按值传递

当引用类型参数传递时,是对托管堆上对象实例内容的操作。
也就是引用类型按值传递,传递的是引用变量的指针,指向托管堆上的对象实例。

class Program { static void Main(string[] args) { Student student = new Student(); Add(student); Console.WriteLine("参数传递之后的值为:" +student._score); Console.ReadKey(); } private static void Add(Student s) { Console.WriteLine("参数传递之前的值为:" + s._score); s._score = 90; } } public class Student { public int _score = 80; }

结果

可见,引用类型参数在被方法调用的时候,是针对变量的引用的操作,一旦引用对象内容发生改变,原来变量的值也随着改变。

按引用传递 ref和out

引用类型参数按值传递和按引用传递的不同之处:

按值传递,传递的是参数本身的值,即引用指针。

按引用传递,传递的是参数的地址,也就是实例指针。

另外,值类型也有按引用传递,这时候,传递的是值类型的地址。

class Program { static void Main(string[] args) { int i = 100; string str = "one"; ChangeByValue(ref i); ChangeByRef(ref str); Console.WriteLine(i); Console.WriteLine(str); Console.ReadKey(); } private static void ChangeByValue(ref int iValue) { iValue = 200; } private static void ChangeByRef(ref string sValue) { sValue = "One more"; } }

可见,不管是值类型,还是引用类型,加入关键字ref作为参数,就意味着是对参数地址的操作,即托管堆上实例地址的改变。

另外:

如果需要按引用传递,方法的定义和方法的调用,都要显式地使用ref和out。

如果一个方法的参数除了ref和out关键字不同,还有其他参数不同,这才构成方法的2个重载。如果仅仅ref和out关键字不同,会报错"...不能仅在ref和out上有差别的重载方法"。

ref和out使用时的不同点:

out告诉编译器,参数会在方法内部初始化,而在方法之前不需要初始化。

int x; Foo(out x);

ref告诉编译器,参数在方法之前必须初始化。

int y = 0; Foo(ref y); 特殊引用类型string的传递 class Program { static void Main(string[] args) { string str = "Old String"; Console.WriteLine("传递之前的值为:" + str); ChangeStr(str); Console.WriteLine("传递之后的值为:"+str); Console.ReadKey(); } private static void ChangeStr(string astr) { astr = "Change String"; } }

结果:

可见,虽然string是引用类型,但按值传递的表现和值类型按值传递的表现一样。

总结

引用类型按值传递,改变的是引用变量指向的托管堆上对象实例的内容。

引用类型按引用传递,改变的是引用变量指向的托管堆上对象实例的地址。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易知道(ezd.cc)的支持。如果你想了解更多相关内容请查看下面相关链接

推荐阅读

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    魅蓝note6性能参数有哪些

    魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

    设置总账参数|用友u8设置总账参数

    设置总账参数|用友u8设置总账参数,,1. 用友u8设置总账参数1、首先要点开数据权限控制设置;2、选择想要设置控制的单据;3、打开后看到左上角

    csgo参数设置|csgo怎么保存

    csgo参数设置|csgo怎么保存,,csgo怎么保存第一步下载csgo的官方版本。然后再下载一个5e对战平台,PS:5e的账号和csgo的账号不是一个账号。第

    移动apn设置|移动apn设置参数

    移动apn设置|移动apn设置参数,,移动apn设置参数1、打开手机系统设置界面应用,点击页面中的“移动网络”设置选项。2、进入移动网络设置页面

    均线最佳设置|均线最佳参数设置

    均线最佳设置|均线最佳参数设置,,1. 均线最佳参数设置所有指标包括kd macd均线,是根据已有价格计算得出,看指标落后于看价格分析,也就是k线。

    viv0nex参数配置|viv0x60参数

    viv0nex参数配置|viv0x60参数,,1. viv0nex参数配置运行内存:6GB机身容量:128GB电池类型:锂聚合物电池2. viv0x60参数没有15+256,所谓的15是内存