C#
四、方法与参数
4.1 方法的调用
- 完全限定的方法名称包括命名空间、类型名称和方法名称
- 在同一个命名空间下的同一个类中的方法,可以不使用完全限定的方法名称
4.2 命名空间
- 命名空间是一种分类机制,用于组合功能相关的所有类型
- 命名空间层级一般从公司名开始,然后是产品名,最后是功能领域
4.3 表达式主体方法
- 为了支持不带方法主体的最简单的方法声明
- 如果方法体中只有一条表达式,且表达式的返回类型和方法的返回类型匹配,则可简写为public int count() => count+=20;
4.4 using指令
4.4.1 using
- 省略任意命名空间的引用,不需要使用完全限定名
- using指令不会导入任何嵌套命名空间中的类型,例如System 和 System.Text的关系
- 嵌套命名空间必须显式导入
4.4.2 using static
- 为静态方法或静态成员变量省略命名空间及类的引用
- using static System.Console;
4.4.3 使用别名
- using alias = System.Console;
4.5 参数
4.5.1 ref 引用参数
- 相当于给变量取别名,并未重新开辟一段内存并复制值或地址。
- 指向实参的同一个地址,而不是复制实参地址对应的内存中存储的值。
- 需要在传参前初始化
4.5.2 out 输出参数
- 引用传递,传参后必须对其赋值;
4.5.3 参数数组
- params string[ ]
- 可变参数
- 3必须是最后一个参数,最多只有一个这样的参数数组
4.6 递归
- 问题已分解至最小,不可再分,返回计算结果,不再调用自身即停止递归;
- 采取措施将大问题分解成下一级小问题,递归调用自身进行问题分解
- 每次返回一个需要下一级数据支撑的结果,直到自身就能提供结果为止。
4.7 方法重载
- 方法重载
- 方法名相同,但方法签名不同;方法签名由方法名、参数数量、参数类型决定。
- 常见的重载形式
- 在一个方法中实现核心逻辑,考虑参数的所有情况
- 在其他方法中调用这个方法,只改变输入参数
- 例如,核心逻辑考虑两个参数的情况,需要输入路径和拓展名
- 一个参数的方法重载的实现是通过调用核心方法,并在调用时给拓展名设置为".cs"
- 无参方法重载的实现是通过调用一个参数的方法,在调用时将路径设为当前路径。
4.8 可选参数
- 在形参声明时,给形参设默认值
- 解决重载需要单独重新定义方法的问题。
- 比如,核心方法需要两个参数,则给路径设为默认值".cs",当输入一个参数时,则路径默认设为".cs"
- 默认值必须是可以确定的值,如常量。
4.9 命名参数
- 可在调用方法时显式指出输入的形参名
- 针对可选参数需要按顺序判断参数赋值问题
- 形参不能修改
- 否则需要在所有方法调用位置同步修改。
- 当方法重载和可选参数一起使用时,若对调用的方法会发生歧义,默认调用没有可选参数的方法
- 比如针对同一个方法名,既用方法重载接收一个参数
- 又用可选参数在接收一个参数的情况下还可接收两个可选参数
- 当调用方法输入一个参数时,则调用的是没有可选参数的方法。
4.10 方法解析
- 当存在多个方法重载,且输入参数都需要隐式转型时,则会调用形参类型更接近的方法
- 最好在调用时显式转型
4.11 异常
4.11.1 try/finally
- 如果没有catch或者没catch到,则会在栈中寻找能catch的地方
- 如果还是没有找到,则finally是否执行取决于计算机的具体实现,即操作系统的不同。
4.11.2 常规catch块
- catch中没有参数
- 默认获取object类型
- 避免使用
- C#2.0及以后,所有异常都派生于System.Exception
- 即使是其他语言引发的不是从Exception派生的异常,也会封装在System.Runtime.CompilerServices.RuntimeWrapperedException
- 该类派生自Exception
4.11.3 throw
- 主动抛出异常
- 该异常可以是通过new创建的,也可以是空异常 throw;
- new创建
- 会替换为当前调用栈信息
- 空异常
- 用于在接收异常后无法处理需要重新抛出原始异常
- new创建
- 该异常可以是通过new创建的,也可以是空异常 throw;