C#中使用[Optional]特性标记的参数如何判断是否被调用方主动传入?
解决方案
方案1:可空值类型参数标记
将[Optional]特性修饰的参数改为可空值类型int?,默认取值为null,即可通过是否为null精准判断调用方是否主动传参:
class Program { static void Main(string[] args) { var c1 = cc(5); // 未传b参数,b取值为null var c2 = cc(5, 0); // 主动传入0,b取值为0 } public static int cc(int a, [Optional] int? b) { int c = 0; if(b.HasValue) { // 调用方主动传参分支 c = a * b.Value; } else { // 未传参走默认逻辑分支 c = a * a; } return c; } }
该方案无需修改现有调用侧代码,即可完美区分主动传0和未传参的两种场景。
方案2:方法重载(更推荐)
不需要依赖[Optional]特性,直接定义两个方法重载即可天然区分两种调用场景,代码可读性和可维护性更高:
class Program { static void Main(string[] args) { var c1 = cc(5); // 匹配单参数重载 var c2 = cc(5, 0); // 匹配双参数重载 } // 仅带a参数的重载,对应未传b的场景 public static int cc(int a) { return a * a; } // 带a、b两个参数的重载,对应主动传b的场景 public static int cc(int a, int b) { return a * b; } }
内容的提问来源于stack exchange,提问作者user8630414
相关产品推荐
相关产品推荐

