指示构造函数方法在 null 时使用默认值

Instruct constructor method to use default value if 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...
    }
}

如果超时为空,我想使用客户端的默认超时 (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;
}

我不喜欢这个解决方案,因为默认值不再暴露在构造函数的签名中(充当 excellent/free 文档)。

3) 使用默认值处理 Client() 中的空值

public class Client(string username, string password, int? timeout = 60) 
{
    _timeout = timeout ?? 60;
}

我不喜欢这个解决方案,因为 1) 处理 null 的方式不是很明显(需要更多文档),以及 2) 默认值是重复的(如果有人修改了一个但忘记修改另一个,它会很糟糕) .

4) 在 Main

中使用空运算符和 usedefaultparam 关键字
static void Main(string[] args)
{
    Client client = new Client(Username, Password, Timeout ?? usedefaultparam);
    // ...
}

我喜欢这个解决方案,因为如果我添加更多可选参数,它很容易阅读并且发展得很好。

我不喜欢它,因为 usedefaultparam 关键字似乎不存在。

因此我的问题是:

是否存在类似选项 4 的内容?如果不是,是否有我没有想到的更好的第五种模式?

调用者要么应该为超时参数提供一个值,要么使用 Client class' 构造函数中定义的默认值。

如果您希望能够在调用者 class 中使用您在 Client class 中定义的默认值,您应该从 Client 公开它] class。例如,您可以使用常量来执行此操作:

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);
    // ...
}