TryParse:什么更具可读性?

时间:2008-10-19 11:06:51

标签: c#

Out style:

bool result;
if(something.TryParse(val, out result))
{
    DoSomething(result);
}

Nullable风格:

bool? result = something.TryParse2(val);
if(result.HasValue)
{
    DoSomething(result.Value);
}

8 个答案:

答案 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中已经存在的习惯用法。