关于C#中的参数传递问题.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:6 大小:172KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

关于C#中的参数传递问题.pdf

关于C#中的参数传递问题.pdf

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

老徐官网:http://www.xyxtl.org学习群号:92980868邮箱:xyxtl@163.com关于C#中的参数传递问题首先我们要理解参数传递的作用,为什么要用到参数传递?如图1所示:类A:变量var类A中存在成员变量var,两个成员方法:方法1和方法2,方法方法1:1中存在局部变量var1,方法2中存在局部变量var2.现在方法1有个任变量Var1务要完成,因为这个任务比较复杂,所以他要初一部分来让访法2来完成,也就是要调用访法2。访法2要完成的工作就是处理数据,把结果返回给访法1。现在我们看,如果访法2要处理的数据是类A的成员变量var。方法2:因为var和方法1、方法2同为类的成员,他们可以相互访问,也就变量Var2是说变量为两个方法所共同拥有,这时候是不需要传递变量var的,因为在两个方法中都可以访问到变量var。图1如果方法1交给方法2的任务是处理变量var1时情况就不同了,因为变量var1是存在于方法1中的局部变量,只有在方法1的内部才能访问到var1。所以,只有把var1的信息传递给方法2,访法2才能完成任务。这时候就需要也是必须传递参数。我们知道:变量分为值类型和引用类型。值类型变量通常分配在栈内存,变量中直接包含数据的副本,所以使用的效率比较高。而引用类型变量分配在托管堆中,引用类型变量中通常包含一个指向实例的指针,变量通过指针引用实例。举个例子来说:把变量比作一个盘子,我们要用他来存放一个苹果。如果把苹果直接放到盘子里,这个盘子就是一个值类型的变量,因为它直接存放的苹果本身;如果盘子里不直接放苹果,而是放了一张纸条,这个纸条上写着苹果所在的具体位置,我们可以在盘子里找到纸条,然后通过纸条上的“苹果的地址”拿到苹果,这时候盘子就是一个引用类型的变量。这两种类型的变量作为参数被传递时,情况有什么不同呢?先看值类型变量的传递:staticvoidMain(string[]args){inta=3,b=5;Console.WriteLine("a={0},b={1}",a,b);Swap(a,b);Console.WriteLine("a={0},b={1}",a,b);Console.ReadKey();}staticvoidSwap(intx,inty){intz;z=x;x=y;y=z;}a:3x:3z:b:5y:5图2如图2:参数a,向参数x传递,因为a是整型变量,属于值类型。在传递参数时传递的是变量的值,也就是数据副本。这时候系统会首先新开辟一个存储空间x,然后把参数a的值拷贝到x中。参数b向参数y传递亦同。在方法swap中,x,y,z三个变量如图示方向赋值,x和y中的值将交换。但因为a和x,b和y的存储空间是彼此独立的,所以交换x,y的值并不会影响到变量a,b;所以执行结果为:下面我们看引用类型变量的传递:classA{publicintnum;}老徐官网:http://www.xyxtl.org学习群号:92980868邮箱:xyxtl@163.comclassProgram{staticvoidMain(string[]args){Aa1=newA();Aa2=newA();a1.num=3;a2.num=5;Console.WriteLine("a1.num={0},a2.num={1}",a1.num,a2.num);Swap(a1,a2);Console.WriteLine("a1.num={0},a2.num={1}",a1.num,a2.num);Console.ReadKey();}staticvoidSwap(Ax,Ay){Az;z=x;x=y;y=z;}}num:3num:5za1a2xy图3如图3:变量a1和a2是类A的实例对象,系统在托管堆中分配存储空间a1和a2,其中保存了指向各自实例的指针,把a1和a2作为参数传递,其实传递的还是参数中包含的内容,但这时候两个变量中的内容不是实例本身,而是指向实例的指针,简单的说就是传递的是地址。这样的话x接收a1的内容,也就是a1所指向的实例的地址,y接收的是a2的内容,也就是a2所指向的实例的地址。同图2一样,通过中间变量z,实现了x,y两个变量内容的交换,这里交换的是保存在x,y中的指针,x和y中包含的指向实例的指针交换了,而不是a1和a2的内容,更不是a1和a2对应实例