我正在设计一个带有类似这样的构造函数的API包装器:
public class Client(string username, string password, int timeout = 60)
来电者看起来像这样:
class Program
{
private static int? Timeout => GetFromConfig("Timeout");
static void Main(string[] args)
{
Client client = new Client(Username, Password, Timeout);
// do things...
}
}
如果超时为空,我想使用客户端的默认超时(60)。
我知道几个选项:
1)在Main
中使用条件逻辑static void Main(string[] args)
{
if (Timeout == null)
{
Client client = new Client(Username, Password);
}
else
{
Client client = new Client(Username, Password, Timeout);
}
}
我不喜欢这个解决方案,因为1)它是很多代码,2)当我添加条件参数时,代码会呈指数级增长(例如,如果我将int MaxFailedRequests = 5
添加到Client()的签名,我的if / else块增长到4个街区。)
2)处理Client()
中的空值public class Client(string username, string password, int? timeout)
{
_timeout = timeout ?? 60;
}
我不喜欢这个解决方案,因为默认值不再在构造函数的签名中公开(这可以作为优秀的/免费文档)。
3)使用默认值
处理Client()中的空值public class Client(string username, string password, int? timeout = 60)
{
_timeout = timeout ?? 60;
}
我不喜欢这个解决方案,因为1)它不会立即显现出如何处理null(需要更多文档),以及2)默认值是重复的(如果有人修改了一个但是忘了修改另一个则会发臭)。 / p>
4)在Main
中使用null运算符和usedefaultparam
关键字
static void Main(string[] args)
{
Client client = new Client(Username, Password, Timeout ?? usedefaultparam);
// ...
}
我喜欢这个解决方案,因为如果我添加更多可选参数,它很容易阅读和增长。
我不喜欢它,因为usedefaultparam
关键字似乎不存在。
因此我的问题是:
是否存在类似选项4的内容?如果没有,是否有一个我没想到的更好的第五种模式?
答案 0 :(得分:3)
调用者应该为timeout参数提供值,或者使用Client
类'构造函数中定义的默认值。
如果您希望能够使用在调用者类的Client
类中定义的默认值,则应该从Client
类中公开它。例如,你可以使用常量:
public class Client
{
public const int DefaultTimeout = 60;
public Client(string username, string password, int timeout = DefaultTimeout)
{
//...
}
}
<强>号码:强>
static void Main(string[] args)
{
Client client = new Client(Username, Password, Timeout ?? Client.DefaultTimeout);
// ...
}