C#中方法参数的传递分为两种。一种是值传递,一种是引用传递。
默认是值传递的形式。
通常我们向方法中传递的值,方法获得的是这些值得拷贝,然后使用这些拷贝,当方法执行完毕后,这些拷贝将会被丢弃,而原来的值不将受到影响。
public class User
{
//向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如int),可空类型(int?),还是引用类型,这一点都是成立的
//C#中参数的值传递和引用传递区别。参数按值传递时,是拷贝的一个副本,不改变原来的值。参数按引用传递时,是改变引用的地址,所以会改变原变量的值。
//1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
//2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
int[] arr = {1,2,3,4,5};
public int[] getArray(int[] ar)
{
ar = arr;
return ar;
}
}
class Program
{
static void Main(string[] args)
{
User u = new User();
int[] i = {2,2};
u.getArray(i);
Console.WriteLine(i.Count());
Console.ReadKey();
}
}
output:2 参数按值传递的时候,不会改变变量本身的值,传递的只是一个副本。
引用传递方式。在方法中如果我们想改变值得本身,我们要用参数的引用传递。前面加ref或者out关键字。
1.ref在传给方法前需要初始化,out不需要
2.out在方法内必须被初始化,否则会报错。
public class User
{
//向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如int),可空类型(int?),还是引用类型,这一点都是成立的
//C#中参数的值传递和引用传递区别。参数按值传递时,是拷贝的一个副本,不改变原来的值。参数按引用传递时,是改变引用的地址,所以会改变原变量的值。
//1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
//2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
int[] arr = {1,2,3,4,5};
public int[] getArray(ref int[] ar)
{
ar = arr;
return ar;
}
}
class Program
{
static void Main(string[] args)
{
User u = new User();
int[] i = {2,2};
u.getArray(ref i);
Console.WriteLine(i.Count());
Console.ReadKey();
}
}
output:5
引用类型按照值传递的形式传递参数的时候,也是传递一个引用的副本,当改变这个引用里面的值得时候,原类型里的值也会改变的。但是如果你指向一个新的引用的话,就不会改变原类型的值得。
class PassingRefByRef
{
static void Change(int[] pArray)
{
// Both of the following changes will affect the original variables:
pArray[0] = 888;
pArray = new int[5] { -3, -1, -2, -3, -4 };
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
}
static void Main()
{
int[] arr = { 1, 4, 5 };
System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);
Change(arr);
System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr[0]);
Console.ReadKey();
}
输出结果是:1,-3,888
我们都知道String是引用类型,但是String在赋值的时候容易给人一种是值类型的假象。为什么呢,因为String对象创建后是不能改变的,我们修改String对象的值,其实是再重新创建了一个String对象。例如:
class Program
{
static void Main(string[] args)
{
string a = "abc";
string b = a;
a = "xiaobo";
Console.WriteLine(a);
Console.WriteLine(b);
Console.ReadKey();
}
}
输出结果是:xiaobo,abc
分析下:我们把a的引用赋值给了b,那么b就指向了abc这个地址。我们再将a赋值为xiaobo,实际上重新创建了一个String对象。