指示构造方法如果null,则使用默认值



我正在设计带有构造函数的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);
    // ...
}

最新更新