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