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
9
10}
11
12
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-9 按值传递参数图示
下面对图8-9中的四个状态做个说明(见表8-2):