代码之家  ›  专栏  ›  技术社区  ›  Cristian Libardo

特帕瑟:什么更可读?

c#
  •  0
  • Cristian Libardo  · 技术社区  · 17 年前

    风格:

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

    可空风格:

    bool? result = something.TryParse2(val);
    if(result.HasValue)
    {
        DoSomething(result.Value);
    }
    
    8 回复  |  直到 17 年前
        1
  •  9
  •   Hallgrim    17 年前

    Tryparse(val,out result)是由.NET框架在int.Tryparse、datetime.Tryparse等中建立的一个习语。阅读代码的人很可能会熟悉这个习语,因此您应该坚持使用它,除非您找到一个非常好的理由不这么做。

        2
  •  4
  •   Robert Rossney    17 年前

    我不是有意不友好。但是,当您提议对一个成熟的习惯用法进行更改时,如果您的示例代码不正确,就会破坏您的信心。

    第一个例子应该是:

    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 好像是的,我不会叫它 TyPARSES2 . 现在,如果一个方法的名称以 Try ,我们希望它返回 bool 指示它是否成功或失败。创建这个新方法将创建一个期望不再有效的世界。在你放弃这一点之前,想想当你写了一些不起作用的示例代码时,你脑子里在想什么,以及为什么你如此确信 result 需要成为 布尔 .

    你的建议的另一个问题是它似乎试图解决错误的问题。如果我发现自己写了很多 TryParse 块,我要问的第一个问题不是“我如何在更少的代码行中完成这项工作?”我会问,“为什么在我的应用程序中分散解析代码?”我的第一直觉是,当我复制所有这些东西的时候,我会为我真正想做的事情提出一个更高的抽象层次。 三分法 代码。

        3
  •  2
  •   Vinko Vrsalovic    17 年前

    我认为总体而言,out样式更具可读性。人们对可以为空的类型不太熟悉(只需在这里检查有关它们的问题的数量),他们对标准库中不存在的Tryparse2(或在.NET中技术上称之为Tryparse2)的熟悉程度甚至更低。

        4
  •  0
  •   REA_ANDREW    17 年前

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

        5
  •  0
  •   REA_ANDREW    17 年前

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

        6
  •  0
  •   Schotime    17 年前

    我见过许多应用程序中使用的out变量语法。

    我个人也喜欢。

        7
  •  0
  •   JaredPar    17 年前

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

    
    var result = Int32.TryParse("123");
    
        8
  •  0
  •   Jay Bazuzi Buck Hodges    17 年前

    我发现这两个例子都很笨拙。

    我会选择 TryParse 因为它是一个已经存在于.NET框架中的习语。