方法的参数传递有两种方式 :传值方式和传引用方式
一.传值方式
1.定义:在方法的参数中没有ref 或out修饰的参数都是以传值方式传递的
2.特点:传值分为两种情况:
a.当参数为值类型时,那么向方法传递的是具体的值,参数在以传值方式传递时,那么形参接收到的将是实参具体值的一个副本,那么对形参做的任何修改都不会影响到实参,因为实参和形参在内存中的存储位置不同。
b.当参数时引用类型时,那么向方法传递的是变量的引用,所以参数在以传值方式传递时,形参接收到的是实参(引用变量)的引用地址的副本,而实际数据的存储位置没有发生变化,这样对形参的数据的修改也就间接的修改了实参的数据,但是对形参对象的改变不会影响到实参对象
二.传引用方式
1.定义:在方法的参数中含有ref或out修饰的参数是以传引用方式传递的
2.特点:传引用分为两种情况:
a.当参数为值类型时,那么向方法传递的是具体的值,参数以传引用方式传递时,形参接收到的不是实参的副本而是实参本身的数据,(相当于给实参创建了一个快捷方式,名字是形参,但是它代表的确实实参),所以对形参的任何修改,都将反应到实参上。
b.当参数时引用类型时,那么向方法传递的是变量的引用,参数以传引用方式传递时,形参接收到的不是实参引用的副本而是实参本身,所以在方法内对形参的重新分配内存(重新new),也会影响到实参,因此给形参做的任何修改都会反应到实参上,包括重新new 以及修改数据。
三.实例
1.传值实例:
class Program
{
static void Main(string[] args)
{
int myInt = 5;
int[] myArr ={1,4,5};
//当参数时值类型
Console.WriteLine("当参数时值类型时的结果如下:");
//在调用在SquareIt(int x)方法前
Console.WriteLine("在调用在SquareIt(int x)方法前 myInt={0}",myInt);
//在调用在SquareIt(int x)方法中
Console.WriteLine(SquareIt(myInt));
//在调用在SquareIt(int x)方法后
Console.WriteLine("在调用在SquareIt(int x)方法后 myInt={0}", myInt);
//当参数时引用类型
Console.WriteLine("当参数时引用类型时的结果如下:");
//在调用在Change(int[] arr) 方法前
Console.WriteLine("在调用在Change(int[] arr) 方法前 myArr[0]={0}", myArr[0]);
//在调用在Change(int[] arr) 方法中
Console.WriteLine(Change(myArr));
//在调用在Change(int[] arr) 方法后
Console.WriteLine("在调用在Change(int[] arr) 方法后 myArr[0]={0}", myArr[0]);
Console.ReadKey();
}
static string SquareIt(int x)
{
x *= x;
return string.Format("在SquareIt(int x)内 x={0}",x);
}
static string Change(int[] arr)
{
arr[0] = 888;
arr = new int[5] { -1,-2,-3,-4,-5};
return string.Format("在Change(int[] arr) 内 arr[0]={0}", arr[0]);
}
}
最后结果是:
/// 在调用在SquareIt(int x)方法前 myInt=5
/// 在SquareIt(int x)方法中 x=25
/// 在调用在SquareIt(int x)方法后 myInt=5
///
/// 在调用在Change(int[] arr) 方法前 myArr[0]=1
/// 在Change(int[] arr) 方法中 myArr[0]=-1
/// 在调用在Change(int[] arr) 方法前 myArr[0]=888
1.传值实例:
class Program
{
static void Main(string[] args)
{
int myInt = 5;
int[] myArr = { 1, 4, 5 };
//当参数时值类型
Console.WriteLine("当参数时值类型时的结果如下:");
//在调用在SquareIt(int x)方法前
Console.WriteLine("在调用在SquareIt(int x)方法前 myInt={0}", myInt);
//在调用在SquareIt(int x)方法中
Console.WriteLine(SquareIt(ref myInt));
//在调用在SquareIt(int x)方法后
Console.WriteLine("在调用在SquareIt(int x)方法后 myInt={0}", myInt);
//当参数时引用类型
Console.WriteLine("当参数时引用类型时的结果如下:");
//在调用在Change(int[] arr) 方法前
Console.WriteLine("在调用在Change(int[] arr) 方法前 myArr[0]={0}", myArr[0]);
//在调用在Change(int[] arr) 方法中
Console.WriteLine(Change(ref myArr));
//在调用在Change(int[] arr) 方法后
Console.WriteLine("在调用在Change(int[] arr) 方法后 myArr[0]={0}", myArr[0]);
Console.ReadKey();
}
static string SquareIt(ref int x)
{
x *= x;
return string.Format("在SquareIt(int x)内 x={0}", x);
}
static string Change(ref int[] arr)
{
arr[0] = 888;
arr = new int[5] { -1, -2, -3, -4, -5 };
return string.Format("在Change(int[] arr) 内 arr[0]={0}", arr[0]);
}
}
最后结果是:
/// 在调用在SquareIt(int x)方法前 myInt=5
/// 在SquareIt(int x)方法中 x=25
/// 在调用在SquareIt(int x)方法后 myInt=25
///
/// 在调用在Change(int[] arr) 方法前 myArr[0]=1
/// 在Change(int[] arr) 方法中 myArr[0]=-1
/// 在调用在Change(int[] arr) 方法前 myArr[0]=-1