《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第5章 方法 笔记
var关键字:
- 只能用于本地变量。
- 只能用于包含initializer的变量声明,编译器依据initializer推断变量的类型。
- 一旦编译器推断出变量的类型,它就是固定不变的。
与C/C++不同,C#不能在一个名称的作用域内声明相同的名称,即使这个相同的名称在嵌套块内部。
常量:
- 通过const关键字声明。与C/C++不同,const不是修饰符,是核心声明的一部分,必须紧挨类型名,放在类型名之前。
- 必须包含initializer。初始值必须在编译期确定,因此它不能是某个对象的引用,可以是null。
- 声明后值不能改变。
值参数:
- 默认类型的参数。
- 在栈上为形参分配内存。
- 将实参的值拷贝给形参。实参可以是表达式。如果实参是变量,则必须已初始化。
引用参数:
- 形参与实参都使用ref修饰。
- 实参必须是变量,并且必须已初始化。
- 不为形参分配内存,形参是实参的别名。
输出参数:
- 形参与实参都使用out修饰。
- 实参必须是变量,不需要初始化。
- 不为形参分配内存,形参是实参的别名。
- 形参在函数内部被读取之前,必须先赋值。
- 形参在函数返回之前,必须赋值。
参数数组:
- 形参使用params修饰。
- 形参的类型必须为一维数组。
- 一个函数只允许有一个参数数组,并且必须作为最后一个形参。
- 形参对应0或1或多个参数数组元素类型的实参,或一个参数数组类型的实参。
- 在栈上为参数数组的引用部分分配内存,在堆上为参数数组的元素分配内存。
值参数、引用参数、输出参数、参数数组简单对比:
一个类中可以拥有多个重名的方法,称为方法重载(method overload)。注意与方法覆写(method overload)区分。
方法重载的签名(signature)必须不同,签名包括名称、参数个数、参数的类型和顺序,参数修饰符,签名不包括返回值类型、参数名称。一个类拥有签名相同,返回值类型不同的方法会报错。
位置参数:形参与实参位置一一对应。
命名参数:实参以形参名、冒号、实参值的方式给出。形参与实参位置不需要对应。
命名参数可以与位置参数一起使用,但位置参数必须写在命名参数之前。
可选参数:指函数声明时,设定默认值的形参,这些形参在函数调用时可以省略对应的实参。
- 可选参数只能是值参数。
- 可选参数的默认值在编译期确定,因此引用类型只能为null。
- 可选参数在形参列表中,必须位于必填参数之后,参数数组之前。(必填参数和参数数组可以不存在)
- 函数调用时,使用位置参数,则可选参数对应的实参必须从后向前省略,使用命名参数无此限制。
每个函数调用时,会创建一个栈帧并入栈,函数调用结束时弹栈。
栈帧包含返回地址(函数返回时,继续执行的地址),为形参分配的内存,其他函数调用相关的管理数据项。