8.6 四种类型的参数

截至目前,我们学习的参数都是一种类型,也是默认参数类型,叫做值参数。下面将学习另外几种参数,它们的行为和值参数稍有不同。

8.6.1 按值传递参数

值参数是通过将实参的值复制到形参,来实现将值传递到方法,也就是我们通常说的按值传递。方法被调用时,CLR做如下操作:

❑在托管堆栈中为形参分配空间;

❑将实参的值复制到形参。

值参数中,实参也可以是任何计算结果满足类型要求的表达式,不一定是变量。关于这一点,举例如下,如代码清单8-8所示。

代码清单8-8 使用表达式做实参


MethodSample ms=new MethodSample();

int l=10;

int w=20;

int result=ms.Add(l*2,(w+10)/10);

Console.WriteLine("Add(l*2,(w+10)/10)={0}",result);

public int Add(int a,int b)

{

return a+b;

}


上述代码中,(l*2)和((w+10)/10)充当了实参的角色,这两个表达式的计算结果均为int型,它们满足Add方法对签名类型的要求,因此是可以的。

下面,通过一个例子(见代码清单8-9),分别观察形参、实参在托管堆和托管栈中的分配和使用情况,以加深对值参数的理解。

代码清单8-9 按值传递参数示例


1 public class MethodSample

2{

3 public static void Main()

4{

5 MethodSample ms=new MethodSample();

6 Rectangle rectangle=new Rectangle();

7 int myValue=10;

8

98.6 四种类型的参数 - 图1

10}

11

128.6 四种类型的参数 - 图2

13{

14 rect.Length+=10;//长度加10

15 rect.Width+=15;//宽度加15

16 rect.Area=rect.Length*rect.Width;//计算矩形面积

17 value++;//第2个参数自增1

18}

19}

20

21//矩形类

22 public class Rectangle

23{

24 public int Length=10;//初始化长度为10

25 public int Width=15;//初始化宽度为15

26 public int Area;

27}


我们把代码清单8-9的代码用图表示如下,揭示托管堆栈和托管堆中的资源分配情况,如图8-9所示。

8.6 四种类型的参数 - 图3

图 8-9 按值传递参数图示

下面对图8-9中的四个状态做个说明(见表8-2):

8.6 四种类型的参数 - 图4