C#中为SavePhoneInfo方法extensionNumber设默认值的位置及参数传递顺序问询
问题解答
嘿,这个问题我刚好熟,给你掰扯清楚:
一、extensionNumber参数的位置
你需要把带默认值的extensionNumber参数放在**out string msg之前,同时要移到所有无默认值的必选参数(也就是isActive、userID)之后**。
为啥不能直接在原来的位置加默认值?因为C#有个硬性规则:带有默认值的可选参数必须排在所有无默认值的必选参数后面。你原来的参数列表里,extensionNumber后面的isActive、userID都是没有默认值的必选参数,如果直接给extensionNumber加默认值,编译器会直接报错。
调整后的代码大概是这样的:
public static bool SavePhoneInfo(int applicantId, string phoneType, string phoneNumber, bool isActive, int userID, string extensionNumber = "", out string msg) { DataAccess dal = new DataAccess(); // 注意这里要同步调整内部调用dal.SavePhoneInfo的参数顺序,确保参数对应正确 return dal.SavePhoneInfo(applicantId, phoneType, phoneNumber, extensionNumber, isActive, userID, out msg); }
二、C#参数传递的顺序规则
总结成几条好记的规则,都是编译器强制执行或业界公认的最佳实践:
- 必选参数排最前:所有没有默认值的参数(普通值参数、
ref参数)必须放在列表最开头,调用时必须显式传值,不能省略。 - 可选参数跟在后:带默认值的参数必须放在所有必选参数之后,调用时可以省略,直接用默认值;如果要传自定义值,用位置或命名参数都可以。
- out/ref参数放最后:
out和ref参数不能设默认值,而且必须显式传递。语法上它们可以放在可选参数之前,但那样调用时如果想使用可选参数的默认值,必须用命名参数,会让代码可读性变差,所以业界都默认把它们放在最后。
另外提一句:用命名参数可以打破位置限制,但除非特殊场景,不然还是遵循上面的顺序更符合编码习惯,团队协作也更顺畅。
内容的提问来源于stack exchange,提问作者mohammad mazharul hoque
相关产品推荐
相关产品推荐

