基础用法:声明与调用
通过在参数后添加=默认值来声明可选参数:
// 圆柱体体积计算方法
double GetVolume(double radius=1.0, double height=5.0)
{
return Math.PI * radius * radius * height;
}
三种调用方式:
- 全显式调用
GetVolume(2.0, 10.0) - 部分省略(必须从右往左省略)
- GetVolume(2.0) // height使用默认值5.0
全默认调用
GetVolume()
关键规则(开发者必知)
参数顺序三原则
- 必填参数 → 可选参数 → params参数
错误示例:
void Method(int a=1, int b) ❌
类型限制
值类型:编译时可确定的默认值
引用类型:默认值必须为null
void Log(string msg=null) // 合法
void Log(string msg="") // 编译错误
省略规则
像剥洋葱一样从右往左省略参数,不能跳着省略:
void Process(int a=1, int b=2, int c=3);
Process(10); // ✅ b=2, c=3
Process(10, ,20); // ❌ 编译错误
进阶技巧:命名参数
当需要跳过中间参数时,结合命名参数使用:
var mc = new MyClass();
mc.GetCylinderVolume(height: 2.0); // 仅指定height,radius用默认值
典型应用场景:
- 配置对象初始化
- 需要高可读性的API调用
- 单元测试中的部分参数模拟
实际应用建议
默认值选择
建议选择最常用的值作为默认值,例如:
public void Connect(
string server="localhost",
int timeout=3000)
版本兼容
修改默认值属于破坏性变更,建议:
- 新增重载方法而非修改现有默认值
- 通过XML注释说明默认行为
性能注意
可选参数在编译时展开,不会造成运行时开销。
对比其他方案
方案 | 优点 | 缺点 |
---|---|---|
可选参数 | 代码简洁 | 修改默认值破坏兼容性 |
方法重载 | 类型安全 | 需要维护多个签名 |
Builder模式 | 灵活性高 | 实现复杂度高 |
📌 最佳实践:简单场景用可选参数,复杂配置用Builder模式
思考题
如果你的方法有5个可选参数,但调用者通常只需要自定义其中1个,哪种参数设计模式更合适?欢迎留言讨论!
扫码 关注微信公众号。