c#基础语言编程-按值类型和引用类型传递参数

来源:互联网 发布:mac版finale免费30天 编辑:程序博客网 时间:2024/06/06 09:47

引言

在介绍传递参数介绍前,请明白参数类型和传递方式是不同的。传递方式分为按值类型和引用类型传递参数。参数类型有值类型和引用类型,这个和C++是不同的。这里的传递方式对应c++中的深复制和浅复制。
两钟传递方式不同的标志为在调用函数中是否有ref,out这些标志,有的话,则为按引用传递,没有的话就是按值类型传递参数,根据参数类型的不同,可以分为按值传递值类型参数、按值传递引用类型、按引用传递值类型、按引用传递引用类型。

例子介绍

 //按值传递值类型参数 private static void M1( int m)   {     m++;   }   //按值传递引用类型参数,也可以传递类对象、数组、接口、委托等等都是引用类型参数private static void M5( string name2)  {     name2 = "乔丹";  } // 如果类似在参数中添加ref关键词,则意味这是按引用传递参数,无论是值类型参数还是引用类型参数。//调用string name = "科比";M5(name);Console.WriteLine(name);//输出科比//如果改为:M5(ref name);//当然M5中参数前加关键词refConsole.WriteLine(name);//乔丹

上面中按传递值类型参数更容易理解。

机制解析

值传递,传递的是栈中的内容,(对于值类型,栈中的内容就是对应的数据。对于引用类型栈中内容就是对象的地址)。
引用传递,传递的是栈本身的地址,多个变量名实际上指向的是同一个栈变量。
引用传递必须使用ref关键字修饰。在方法调用的时候传递参数的时候也必须加ref 关键字。这里写图片描述
按照上图解析,在调用时
1、确定传递类型
2、确定参数类型
3、调用操作
在按值类型传递时,则在堆栈中进行操作,首先在栈中申请内存区域,讲复制得到的值拷贝其中,如果是值类型参数,就将值拷贝到新申请的区域。如果是引用类型参数,将对象在栈中地址拷贝一份。因为数据是在堆中,类似在堆中的数据有了两个指针,操作那个指针,里面的数据都会变化。但是如果new个对象时,意味着那就是在堆中有新的对象,数据也会不一样。参照M5调用。
按引用传递时,则是将栈中地址进行拷贝,这就是深复制了。在函数调用时,传递的是栈中地址,意味着函数中操作就是对栈中地址中的数据进行操作了。所以在引用类型中,就是new个对象,意味着栈中地址指向改变,所以返回时,数据会有所改变。

0 0
原创粉丝点击