您的位置:首页 > 编程语言 > C#

方法传递参数的方式

2013-10-31 14:56 239 查看
方法的参数传递有两种方式 :传值方式和传引用方式

一.传值方式

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  值传递 引用传递 c#