C#中调用带多个可选布尔参数的方法如何使用命名可选参数?
解决方法:用C#命名参数轻松搞定
刚好碰到过类似的场景!你需要用C#的**命名参数(Named Arguments)**语法,这完美解决了这种“只想传后面的可选参数,不想写一堆前置false”的需求。
正确的调用方式
直接在调用时指定参数的名称,不用管前面的参数顺序,写法如下:
InitializeTestPatientInfo(Gender: true);
这样编译器就知道你要把Gender设为true,其他可选参数会自动使用默认的false值,完全符合你的预期。
为什么你之前的写法不对?
InitializeTestPatientInfo(Gender = true);:这里的=是赋值运算符,不是命名参数的语法,编译器会把它当成一个表达式处理,自然会报错。InitializeTestPatientInfo(bool Gender = true);:调用方法的时候不能指定参数类型,这是声明方法时才用的语法,调用时这么写完全不符合规则哦。
参数多的时候更实用
当你的方法有一堆可选参数时,命名参数的优势会更明显,比如方法新增了更多参数后,调用时可以清晰地指定要设置的项:
// 示例:同时设置PatientNumber和Gender InitializeTestPatientInfo(PatientNumber: true, Gender: true);
对比一堆true/false的顺序调用,这种写法可读性拉满,别人看代码也能一眼明白你要设置哪些属性。
额外优化建议(可选)
如果你的参数都是布尔类型,用来控制是否赋值对应属性,还可以考虑用**[Flags]枚举**来优化方法设计,让扩展性更好:
[Flags] public enum PatientFields { None = 0, SSN = 1 << 0, PatientNumber = 1 << 1, Gender = 1 << 2 } public static AutoPatientLookup InitializeTestPatientInfo(PatientFields fieldsToSet = PatientFields.None) { var testParams = new AutoPatientLookup(); testParams.FirstName = "First"; testParams.LastName = "Last"; testParams.DOB = "4/9/1953"; testParams.PracticeID = 11071; if (fieldsToSet.HasFlag(PatientFields.SSN)) { testParams.SSN = 000010281; } if (fieldsToSet.HasFlag(PatientFields.PatientNumber)) { testParams.PatientNumber = 458; } if (fieldsToSet.HasFlag(PatientFields.Gender)) { testParams.Gender = "F"; } return testParams; }
调用的时候可以这样写,灵活又清晰:
// 只设置Gender InitializeTestPatientInfo(PatientFields.Gender); // 同时设置SSN和PatientNumber InitializeTestPatientInfo(PatientFields.SSN | PatientFields.PatientNumber);
这种方式在参数数量增多时,不会让方法的参数列表变得冗长,维护起来也更方便。
内容的提问来源于stack exchange,提问作者W.Harr
相关产品推荐
相关产品推荐

