预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

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

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

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:3 z: 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.com classProgram { 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:5 z a1a2xy 图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对 应实例