调用是传值还是传址,主要取决于数据类型和是否使用了ref和out,下面对此作一一分析(本文出处http://blog.csdn.net/AppleDotnet/)
首先是数据类型
C#中的数据类型按我理解的分类有
1、值类型:
a)除string以外的所有基本类型(如int,float,double等);
b)结构的对象;
2、引用类型
a)数组;
b)类的对象;
3、特殊的系统类型;
a)string
说明:
string的特殊之处在于:传递string参数时,传递的是引用(传址),但方法中不可以修改它,这是因为string设计上不能修改的,修改就会产生一个新的string,所以在用代码作测试时,string会看起来像一个传值的调用(在方法中修改不影响原先的变量)
在这里总结一下我个人使用中的经验,供大家参考
1、所有值类型都是传值调用,也就是会复制一份传递给被调用的方法(意味着可能多使用内存)
2、不需要使用ref或out,所有引用类型都是传址调用,即参数是数组或类的对象的时候,C#就已经是用传址调用了,再加ref是没意义的(也不会导致出错),但是out是有意义,因为可能需要传入未定义的引用类型变量;
3、特殊的系统类型string,平时使用中可以把它当作是值类型来看,虽然它实质上不是;
4、ref参数,所有使用了ref的参数都是传址调用————如果你不确定一个变量是值还是引用,可以滥用它;
5、out参数
a)使用了out参数,那这个参数原先的值就是没意义的,因为你在方法内必须构造它(注意是必须),而且根本访问不到原先的值,编译器会提示使用了未赋值的变量;
b)out参数实际上不是一种调用方式,因为它什么值也没传入,它可以理解为一种返回值的约定;