参数分为形参和实参
形参
形参的英文是:Formal Parameter ,通常叫实参,形式参数。
形参是写在方法声明括号内的特殊局部变量,而非写在方法函数体内部。
如下函数名后面的括号里面的两个变量,就是形参了。学过C语言的读者应该对这个形参的概念不陌生。
// x、y 是两个形参
public void PrintArea(int x, float y )
{
}
Code language: C# (cs)
- 具备数据类型与变量名,可读可写;
- 定义位置在方法体外,方法执行前自动完成初始化(
out输出参数除外); - 多参数用逗号分隔,参数数量无限制;
- 在方法体内使用方式和普通的局部变量完全一致。
也就是形参,其实就是特殊的局部变量,它是用来接收调用函数的地方传入的值,也就是它的赋值是发生在函数调用的时候,当执行流程进入到函数内部的时候,形参的值已经赋值完毕了。
public void PrintArea( int x, float y )
{
float area = x * y; // x、y 为形参,area 为普通局部变量 用来保存x和y的乘积
Console.WriteLine($"计算面积: { x } * { y } is { sum }");
}
Code language: C# (cs)
可运行例子
class Program
{
static void Main()
{
Program program = new Program();
program.PrintArea(10,6.5F);
}
public void PrintArea(int x, float y)
{
float area = x * y; // x、y 为形参,area 为普通局部变量 用来保存x和y的乘积
Console.WriteLine($"计算面积: {x} * {y} is {area}");
}
}Code language: C# (cs)
输出
计算面积: 10 * 6.5 is 65
调用函数的时候,就相当于把x的值初始化为10,y的值初始化为6.5
6.5F后面的F表示这是一个float类型的单精度浮点数,如果不带F后缀,编译器会认为它是一个double类型,会报错的。
单精度float和双精度double,它们存储的时候,内存中占的位数是不同的,所以它们可以存储的数据的精确度是不一样的。
所谓精确度就是一个类型可以存储的数据,的小数位数最大支持几位,如果超出了,就可能不准确。这和内存中存储的位数有关系。

x和y是形参。调用的时候
相当于给两个局部变量初始化成这两个值。
int x = 10;
float y = 6.5F;Code language: C# (cs)
注意:
形参的格式,类型,顺序等和方法名组成了方法的签名,所谓签名就是这个函数的身份证的概念。签名我们后面会学习,签名是否一样决定了这个方法是否一样,后面还会学习到函数的重载。
实参
英文叫:Actual Parameters(实参 / 实际参数,又称 arguments)
调用方法时,用来给形参赋值的变量 / 表达式称为实参;方法执行前,会用实参的值初始化对应形参。
- 实参写在方法调用的括号内;
- 类型匹配要求:实参类型必须和对应形参一致,或编译器支持隐式类型转换;
- 位置对应:默认按顺序一一匹配(位置参数 positional parameters)。
例如我们上面代码,Main函数改为如下,调用的地方第一个参数是5,是字面值,第二个参数是一个局部变量f
Program program = new Program();
float f = 6.3F;
program.PrintArea(5,f);
// 5 是常量表达式实参,f 是变量实参
// 顺序对应:5 → x,f → y
Code language: C# (cs)
调用时实参的值复制给对应位置的形参,之后执行方法体代码。

位置参数
class Calculate
{
// 两个int形参
public int Sum(int x, int y)
{
return x + y;
}
// 两个float形参
public float Avg(float x, float y)
{
return (x + y) / 2.0F;
}
}
class Program
{
static void Main()
{
Calculate cal = new Calculate();
int num = 6;
// Sum:实参int匹配形参int
Console.WriteLine("Sum: {0} and {1} is {2}",
5, num, cal.Sum(5, num));
// Avg:int实参隐式转换为float形参
Console.WriteLine("Avg: {0} and {1} is {2}",
5, num, cal.Avg(5, num));
}
}
Code language: PHP (php)
输出结果
Sum: 5 and 6 is 11
Avg: 5 and 6 is 5.5Code language: HTTP (http)
C# 支持窄类型向宽类型隐式转换(int → float),反向 float → int 会编译报错,需要手动强制转换。
num 是int类型,当它作为实参传递给Avg函数的float形参的时候,是编译器会自动隐式转换,把int转换位float,为什么不会报错?因为int可以存储的数字的范围比float窄,也就是int的取值范围被float包括。

所以int传递给float,不会丢失数据,就好比你把一个小箱子放到一个大箱子里面,可以容纳,但是反过来,你把一个大箱子放到一个小箱子,那就容不下。