c#基础语言编程-按值类型和引用类型传递参数
2015-03-17 10:29
555 查看
引言
在介绍传递参数介绍前,请明白参数类型和传递方式是不同的。传递方式分为按值类型和引用类型传递参数。参数类型有值类型和引用类型,这个和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中参数前加关键词ref Console.WriteLine(name);//乔丹
上面中按传递值类型参数更容易理解。
机制解析
值传递,传递的是栈中的内容,(对于值类型,栈中的内容就是对应的数据。对于引用类型栈中内容就是对象的地址)。引用传递,传递的是栈本身的地址,多个变量名实际上指向的是同一个栈变量。
引用传递必须使用ref关键字修饰。在方法调用的时候传递参数的时候也必须加ref 关键字。
按照上图解析,在调用时
1、确定传递类型
2、确定参数类型
3、调用操作
在按值类型传递时,则在堆栈中进行操作,首先在栈中申请内存区域,讲复制得到的值拷贝其中,如果是值类型参数,就将值拷贝到新申请的区域。如果是引用类型参数,将对象在栈中地址拷贝一份。因为数据是在堆中,类似在堆中的数据有了两个指针,操作那个指针,里面的数据都会变化。但是如果new个对象时,意味着那就是在堆中有新的对象,数据也会不一样。参照M5调用。
按引用传递时,则是将栈中地址进行拷贝,这就是深复制了。在函数调用时,传递的是栈中地址,意味着函数中操作就是对栈中地址中的数据进行操作了。所以在引用类型中,就是new个对象,意味着栈中地址指向改变,所以返回时,数据会有所改变。
相关文章推荐
- c#基础语言编程-按值类型和引用类型传递参数
- 传递引用类型参数(C# 编程指南)
- 传递引用类型参数(C# 编程指南)
- C#基础原理拾遗——引用类型的值传递和引用传递
- C# 值类型和引用类型及参数传递
- C#学习基本概念之传递引用类型参数(二)
- C# 数据类型的引用类型、值类型内存存储方式以及区别; 函数参数传递的引用传递(址传递)、值传递区别
- C#基础原理拾遗——引用类型的值传递和引用传递
- java语言-基础(参数的值传递机制(基本数据类型与引用数据类型))
- 复习一下基础:'C# 值类型和引用类型 以及作为方法参数的区别'
- C# 之值类型与引用类型参数[基础]
- C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊
- 基础才是重中之重~值类型与引用类型作为参数传递的不同表现
- 重读编程思想-初始化清理-基础数据类型参数传递给过载方法
- JavaSE8基础 String是特殊的引用类型,在函数的参数传递中只能把它当做 值类型来看待
- 03.java语言基础-参数的值传递机制-引用数据类型
- c#语言基础(2)理解值类型和引用类型
- C#参数传递(值类型、引用类型)
- C#基础原理拾遗——引用类型的值传递和引用传递
- C# 值类型 引用类型 作为参数传递区别