Out style:
bool result;
if(something.TryParse(val, out result))
{
DoSomething(result);
}
Nullable风格:
bool? result = something.TryParse2(val);
if(result.HasValue)
{
DoSomething(result.Value);
}
答案 0 :(得分:9)
TryParse(val,out result)是.NET框架在int.TryParse,DateTime.TryParse等中建立的一个习惯用法。阅读代码的人可能会熟悉这个习惯用法,所以你应该坚持下去对它来说,除非你找到一个很好的理由不去。
答案 1 :(得分:4)
我不是故意不仁慈。但是当你提议改变一个成熟的习语时,如果你的示例代码不对,那就会破坏你的信心。
你的第一个例子应该是:
something result;
if (something.TryParse(val, out result))
{
DoSomething(result);
}
或:
bool result;
if (bool.TryParse(value, out result))
{
DoSomething(result);
}
你的第二个例子应该是:
Nullable<something> result = something.TryParse2(val);
if(result.HasValue)
{
DoSomething(result.Value);
}
或:
bool? result = bool.TryParse2(val);
if (result.HasValue)
{
DoSomething(result);
}
如果我 要为您的TryParse2
执行的操作实现每个值类型的扩展方法,我就不会将其称为TryParse2
。现在,如果方法的名称以Try
开头,我们希望它返回bool
,表示它是成功还是失败。创建这种新方法会创建一个期望不再有效的世界。在你忽略这一点之前,想一想当你编写不起作用的示例代码时你的想法,以及为什么你确信result
需要成为bool
。
关于你的建议的另一件事是它似乎试图解决错误的问题。如果我发现自己写了很多TryParse
块,我要问的第一个问题不是“我怎样才能用更少的代码行完成这个?”我会问,“为什么我在整个应用程序中分散了解析代码?”我的第一直觉是在我复制所有TryParse
代码时,为我真正想要做的事情提出更高级别的抽象。
答案 2 :(得分:2)
我认为风格一般来说更具可读性。人们不太熟悉可空类型(只需在这里查看关于它们的问题数量),他们对标准库中不存在的TryParse2(或者在技术上称为.NET)中更不熟悉。 / p>
答案 3 :(得分:0)
我可能会使用第二个例子。虽然我认为两者都完全可以接受。
答案 4 :(得分:0)
可空类型具有Value属性,该属性不能为同一类型的可空。这是您不需要转换可空类型而是使用可空类型的值的地方。
答案 5 :(得分:0)
我已经看到了许多应用程序中使用的out变量语法。
我个人也喜欢它。
答案 6 :(得分:0)
我更喜欢第二个例子,因为它是一种更类型推理友好的编程风格。具有out参数可防止开发人员对特定调用使用类型推断。
var result = Int32.TryParse("123");
答案 7 :(得分:0)
我发现这两个例子都很笨重。
我选择TryParse
,因为它是.NET Framework中已经存在的习惯用法。