我正在设计带有构造函数的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...
}
}
如果超时为null,我想使用客户端的默认超时(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((的签名中块(。
2(在客户端中处理null值((
public class Client(string username, string password, int? timeout)
{
_timeout = timeout ?? 60;
}
我不喜欢此解决方案,因为默认值不再在构造函数的签名中公开(它是极好的/免费文档(。
3(用默认值
在客户端((中处理null值public class Client(string username, string password, int? timeout = 60)
{
_timeout = timeout ?? 60;
}
我不喜欢这种解决方案,因为1(并不是立即明显处理如何处理零(需要更多文档(,而2(默认值是重复的(如果有人修改了一个但忘记修改另一个(。<<<<<<<<<<<<<<<<<<
4(在main
中使用null Operator和usedefaultparam
关键字 static void Main(string[] args)
{
Client client = new Client(Username, Password, Timeout ?? usedefaultparam);
// ...
}
我喜欢此解决方案,因为如果我添加更多可选参数,它易于阅读和增长。
我不喜欢它,因为usedefaultparam
关键字似乎不存在。
因此,我的问题:
类似选项4之类的东西是否存在?如果没有,我没有想到更好的第五模式?
呼叫者应该为超时参数提供一个值,或者使用 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);
// ...
}