(1)形参
形参是声明在方法的参数列表中而不是方法体中的本地变量。
1.形参需要类型和名称,并能被写入和读出。
2.和方法中的其他本地变量不同,形参在方法体的外面定义并在方法开始之前初始化(out参数除外)。
3.参数列表中可以有任意数目的形参声明,而且声明必须用逗号隔开。
(2)实参
实参是用于初始化参数的表达式或变量。
1.实参位于方法调用的参数列表中,而且可以是变量或者表达式。
2.每个实参必须对应形参的类型相匹配,或者是编译器必须能够把实参的类型转换。
(3)值参数
值参数是通过复制实参的值到形参的方式把数据传递到方法中。
1.系统在栈中为形参分配空间,然后将参数的值复制到形参中。
2.值参数包含了值类型变量的值和引用类型变量的对象引用。
3.值类型的实参值不受方法行为的影响。
4.引用类型的实参值被方法行为改变。
(4)引用参数
1.必须在方法的声明和调用中都是用ref修饰符
2.实参必须是变量,并且在用在实参前必须被赋值。
3.形参的参数名是实参变量的别名,其指向相同内存位置。
(5)输出参数
输出参数用于从方法体内把数据传出到调用代码。
1.必须在声明和调用中都使用修饰符out。
2.实参必须是变量。
3.在方法内部,输出参数在被读取之前必须被赋值。
4.在方法返回之前,方法内部的任何可能路径都必须为所有的输出参数进行赋值。
(6)参数数组
参数数组允许零个或多个实参对应一个特殊的形参。
1.参数列表中只能有一个参数数组,且它必须位于参数列表中最后一位。
2.在数据类型前使用params修饰符,在数据类型后放置一组空的方括号。
3.参数数组有两种方法提供实参,一种是用逗号分隔相同数据类型元素的列表,一种是该数据类型元素的一维数组。
4.当使用元素列表时,参数数组的实参可以使用变量或者表达式。
5.参数数组声明时使用params修饰符,调用中不允许使用params修饰符。
6.如果数组参数是值类型,那么值被复制,实参不受方法内部的影响。
7.如果数组参数是引用类型,那么引用被复制,实参引用的对象可以受到方法内部的影响。
8.当使用元素列表时,编译器会声明并初始化形参数组。
9.当使用元素数组时,编译器会直接引用元素数组而不是声明新的形参数组
(7)命名参数
命名参数可以显式指定参数的名字,就可以以任意顺序在方法调用中列出实参。
1.形参的名字后面跟着冒号和实际的参数值或表达式。
2.在调用的时候,可以既使用位置参数又使用命名参数,但是位置参数必须先列出。
namespace ConsoleApp1
{
class Program
{
private static void Main()
{
AddClass addClass = new AddClass();
int result = addClass.Add(y: 20, x: 10);
Console.WriteLine(result);
}
}
public class AddClass
{
public int Add(int x, int y)
{
return x + y;
}
}
}
(8)可选参数
可选参数是我们在调用方法的时候包含参数,也可以省略参数。
1.可选参数在方法声明的时候为参数提供默认值。
2.可选参数只能是值参数类型。
3.所有必填参数必须在可选参数声明之前声明。如果params参数,必须在所有可选参数之后声明。
4.可选参数从可选参数列表的最后开始省略,一直省略到列表开头。
5.可选参数设置默认值时一定要使用不变的值,否则,在更迭程序集时,可能会引起调用方产生错误。
namespace ConsoleApp1
{
class Program
{
private static void Main()
{
AddClass addClass = new AddClass();
int result = addClass.Add(x: 10);
Console.WriteLine(result);
}
}
public class AddClass
{
public int Add(int x, int y=30)
{
return x + y;
}
}
}
(9)栈帧
在调用方法的时候,内存从栈的顶部开始分配空间,保存和方法关联的数据项。这块内存空间叫做方法的栈帧。
1.栈帧保存方法返回地址,也就是在方法退出的时候继续执行的位置。
栈帧包括为参数分配的内存以及和方法调用相关的其他管理数据项。
2.在方法调用时,整个栈帧都会被压入栈
3.在方法退出时,整个栈帧都会从栈中弹出,此时也叫做栈展开。
(10)方法签名
方法的签名由以下信息组成
1.方法的名称
2.参数的数目
3.参数的数据类型和顺序
4.参数修饰符