C# 值类型传参、引用类型传参
一、传递参数
C#传递参数方式有两种,可以通过按值传递也可以按引用传递。而其本身类型有值类型与引用类型两种,下面分类详细说明。
二、按值传参
1.值类型
值类型存储在栈中,故按值传递时只是简单传递一份复制数据,接受参数的函数操作的只是一个副本,对原数据未做任何修改。
示例代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public static void ChangeValue(Int32 k) { k = 200; } static void Main(string[] args) { Int32 number = 100; Console.WriteLine("修改前:{0}", number); ChangeValue(number); Console.WriteLine("修改后:{0}", number); } } }
修改前:100
修改后:100
2.引用类型
引用类型存储空间在堆栈和堆中都有,堆栈中存储其在堆中的地址,按值传递引用类型时,传递的是地址的副本,在函数内部修改时,只会修改到原对象的数据,而不能实现对原对象的整体修改(因为对象存储在堆中,修改对象只是在堆中新建一个对象)。
实例代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public static void ChangeValue(Int32[] k) { k[0] = 1; k = new Int32[3] { 3, 3, 3 }; } static void Main(string[] args) { Int32[] number = {100,200,300}; Console.WriteLine("修改前:{0},{1},{2}", number[0],number[1],number[2]); ChangeValue(number); Console.WriteLine("修改后:{0},{1},{2}", number[0], number[1], number[2]); } } }输出结果:
修改前:100,200,300
修改后:1,200,300
三、按引用传递
1.值类型
值类型按引用传参时,传递的是其在栈中的地址,因此,函数修改数据时,会根据传递过来的地址去取数据(获得原数据),因此修改的是本身。
示例代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public static void ChangeValue(ref Int32 k) { k= 1; } static void Main(string[] args) { Int32 number = 100; Console.WriteLine("修改前:{0}", number); ChangeValue(ref number); Console.WriteLine("修改后:{0}", number); } } }
修改前:100
修改后:1
2.引用类型
按引用传参时,传递的是栈中的地址,继而会根据改地址找到对应的堆中的对象数据,因此,修改的也会是对象本身。
示例代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public static void ChangeValue(ref Int32[] k) { k = new Int32[3] { 3, 3, 3 }; k[0] = 1; } static void Main(string[] args) { Int32[] number = {100,200,300}; Console.WriteLine("修改前:{0},{1},{2}", number[0],number[1],number[2]); ChangeValue(ref number); Console.WriteLine("修改后:{0},{1},{2}", number[0], number[1], number[2]); } } }
按引用传参时需要用到ref与out两个关键字,其区别如下:
1.ref传参时,传入的参数必须是初始化之后的数据;而out,必须在方法中对其完成初始化;
2.使用out可以返回一个值
3.params用于传递数组参数
参考:http://blog.csdn.net/trustin_/article/details/9943617(有图解释,比较直观)
C# 值类型传参、引用类型传参,布布扣,bubuko.com
原文:http://blog.csdn.net/fengzhongzhishenfu/article/details/23254371