案例是我有以下课程,例如:
public class SendFile
{
public SendFile(Uri uri) { /* some code here */ }
public SendFile(string id) { /* some code here */ }
}
然后,我们知道如果我想解析构造函数,我不能这样做:
// some string defined which are called "address" and "id"
var sendFile = new SendFile(String.IsNullOrEmpty(address) ? id : new Uri(address));
我的问题是如何以干净的方式解决此问题,而不创建" if"代码中的分支?喜欢以下内容:
SendFile sendFile;
if(String.IsNullOrEmpty(address))
{
sendFile = new SendFile(id);
}
else
{
sendFile = new SendFile(new Uri(address));
}
答案 0 :(得分:6)
在上面的版本中,您会收到编译错误:
无法确定条件表达式的类型,因为'string'和'System.Uri'之间没有隐式转换
阅读MSDN documentation时,请说明:
first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。
由于string
和Uri
彼此之间没有隐式转换(您也不想要,因为您为什么会有两个不同的构造函数...),
要使用条件运算符,您应该采用不同的方式:
var sendFile = String.IsNullOrEmpty(address) ? new SendFile(id) :
new SendFile(new Uri(address));
答案 1 :(得分:0)
一种选择可能是将static
'工厂'方法添加到SendFile
并在那里处理:
public class SendFile
{
public SendFile(Uri uri) { /* some code here */ }
public SendFile(string id) { /* some code here */ }
public static SendFile Create(string url, string fallbackId = null)
{
return string.IsNullOrEmpty(url)
? new SendFile(fallbackId)
: new SendFile(new Uri(url));
}
}
参数命名应明确指出fallbackId
仅在未提供url
的情况下使用。