1.值参数
使用值参数, 数据通过复制实参的值到形参的方式传递到方法. 方法被调用时, 系统做如下操作:
· 在栈中为形参分配空间
· 复制实参到形参
例:
class MyClass
{
public int Val = 20; //初始化字段为20
}
class Program
{
static void MyMethod(MyClass f1, int f2)
{
f1.Val = f1.v + 5; //参数的字段加5
f2 = f2 + 5; //另一参数加5
}
static void Main(string[] args)
{
MyClass A1 = new MyClass();
int A2 = 10;
MyMethod(A1, A2); //调用方法
}
}
执行后A1.Val的值为25, A2的值为10.
2. 引用参数
· 使用引用参数时, 必须在方法的声明和调用中都使用ref修饰符
· 实参必须是变量, 在用作实参前必须被赋值. 如果是引用类型变量, 可以赋值为一个引用或null值
请记住, 对于值参数, 系统在栈里为形参分配内存. 相应的, 引用参数有以下特征:
· 不在栈里为形参分配新的内存
· 形参的名称相当于实参变量的别名, 引用与实参相同的内存位置
例:
class MyClass
{
public int Val = 20; //初始化字段为20
}
class Program
{
static void MyMethod(ref MyClass f1, ref int f2)
{
f1.Val = f1.v + 5; //参数的字段加5
f2 = f2 + 5; //另一参数加5
}
static void Main(string[] args)
{
MyClass A1 = new MyClass();
int A2 = 10;
MyMethod(ref A1, ref A2); //调用方法
}
}
执行后A1.Val的值为25, A2的值为15.
3. 输出参数
输出参数用于从方法体内把数据传出到调用代码, 它们非常类似引用参数. 如同引用参数, 输出参数有以下要求:
· 必须在声明的调用中都使用修饰符. 输出参数的修饰符是out而不是ref
· 实参必须是变量, 不能是其他表达式类型
就像引用参数, 输出参数的形参担当实参的别名, 形参和实参都是同一内存位置的名称. 但与引用参数不同的是:
· 在方法内部, 输出参数在被读取前必须被赋值. 这意味着参数的初始值是无关的, 而且没有必要在方法调用之前为实参赋值
· 每个输出参数在方法返回之前必须被赋值
因为方法内的代码在读出输出变量前必须对其写入, 所以不可能使用输出参数把数据传入方法.
例:
class MyClass
{
public int Val = 20; //初始化字段为20
}
class Program
{
static void MyMethod(out MyClass f1, out int f2)
{
f1 = new MyClass();
f1.Val = 25; //参数的字段加5
f2 = 15; //另一参数加5
}
static void Main(string[] args)
{
MyClass A1 = null;
int A2 ;
MyMethod(out A1, out A2); //调用方法
}
}
执行后A1.Val的值为25, A2的值为15.