指示构造函数方法在 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);
// ...
}
我正在设计一个 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);
// ...
}