C# 特里帕斯:什么更具可读性?

C# 特里帕斯:什么更具可读性?,c#,C#,格调: bool result; if(something.TryParse(val, out result)) { DoSomething(result); } 可为空的样式: bool? result = something.TryParse2(val); if(result.HasValue) { DoSomething(result.Value); } 我可能会使用第二个例子。尽管我认为两者都是完全可以接受的。我认为out风格总体上更具可读性。人们对可空类型不太熟悉(

格调:

bool result;
if(something.TryParse(val, out result))
{
    DoSomething(result);
}
可为空的样式:

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

我可能会使用第二个例子。尽管我认为两者都是完全可以接受的。

我认为out风格总体上更具可读性。人们对可空类型不太熟悉(只需在此处查看有关它们的问题数量),而且他们对标准库中不存在的TryParse2(或在.NET中的技术名称)更不熟悉。

TryParse(val,out result)是由int.TryParse中的.NET框架建立的一种习惯用法,DateTime.TryParse等。阅读此代码的人可能会熟悉此习惯用法,因此您应该坚持使用它,除非您找到很好的理由不这样做。

可为null的类型有一个值属性,而该属性在同一类型中不可为null。在这里,您不需要转换可为null的类型,而是使用可为null类型的值。

我在许多应用程序中看到了out变量语法


就我个人而言,我也喜欢它。

我更喜欢第二个示例,因为它是一种类型推断更友好的编程风格。具有out参数可以防止开发人员对特定调用使用类型推断


var result = Int32.TryParse("123");

我不是故意不友善的。但是,当您建议对一个已建立的习惯用法进行更改时,如果您的示例代码不正确,则会破坏信心

您的第一个示例应该是:

something result;
if (something.TryParse(val, out result))
{
   DoSomething(result);
}
Nullable<something> result = something.TryParse2(val);
if(result.HasValue)
{
    DoSomething(result.Value);
}
或:

第二个例子应该是:

something result;
if (something.TryParse(val, out result))
{
   DoSomething(result);
}
Nullable<something> result = something.TryParse2(val);
if(result.HasValue)
{
    DoSomething(result.Value);
}
如果我要为每个值类型实现一个扩展方法,它完成了
TryParse2
的功能,我不会称之为
TryParse2
。现在,如果一个方法的名称以
Try
开头,我们希望它返回一个
bool
,指示它是否成功或失败。创建这种新方法会创建一个期望不再有效的世界。在你放弃这一点之前,想想当你写示例代码时,你脑子里在想什么,为什么你如此确信
结果
必须是一个
bool


关于你的建议的另一件事是,它似乎试图解决错误的问题。如果我发现自己写了很多
TryParse
块,那么我要问的第一个问题不是“如何在更少的代码行中实现这一点?”而是“为什么我的应用程序中分散了解析代码?”当我复制所有的
TryParse
代码时,我的第一本能是为我真正想要做的事情提出一个更高层次的抽象。我发现这两个例子都很笨拙


我会选择
TryParse
,因为这是一个在.NET框架中已经存在的习惯用法。

你会重新考虑它是在10年前,C#1.0有空值,你会选择吗?可能,如果当时也有空值返回TryParse。但现在不是10年前了。我认为其他开发人员对核心语言功能的不熟悉是需要解决的问题,而不是解决办法。当然,解决方案正在变得疯狂,并且正在编写已经存在的习惯用法的代码。最好添加这些注释,以及对您要评论的答案的注释,但这需要50个代表。好的观点。将可为null的方法命名为更合适的方法(尤其是尚未“采用”的方法)会更清楚。我假设您知道不能将扩展方法放在类型上,只能放在实例上。您实现了类型的扩展方法,并在静态类方法中实现它们,该方法将该类型的实例作为其参数。有趣。这仅仅是一些例子,还是你有其他的解决方案?并不是你的例子很笨重:考虑到目前的情况,你已经做得很好了。这是语言的局限性。不过,我不知道该如何改变它。这不完全是我喜欢的选择,但考虑到问题的不精确性,我同意答案=)已建立的惯用语论点非常好。不过,这是在添加nullabe之前建立的惯用语。当添加了更好的功能时,微软也破坏了一致性,例如FooCollection和Collection或FooEventArgs和EventArgs的不一致使用。