显式或隐式执行控制语句使用

时间:2009-09-22 10:30:49

标签: c# preferences if-statement

我有时会使用

if (this._currentToolForeColor.HasValue)
    return this._currentToolForeColor.Value;
else
    throw new InvalidOperationException();

其他时候我使用

if (this._currentToolForeColor.HasValue)
    return this._currentToolForeColor.Value;
throw new InvalidOperationException();

这两个是等价的,我知道,但我不确定哪个是最好的,为什么。

这更进一步,因为您可以使用其他执行控制语句,例如brake或continue:

while(something)
{
    if(condition)
    {
        DoThis();
        continue;
    }
    else
        break;
}

while(something)
{
    if(condition)
    {
        DoThis();
        continue;
    }
    break;
}

编辑1:是的循环示例很糟糕,因为它们是合成的(即:为这个问题编写),与第一个实际不同。

7 个答案:

答案 0 :(得分:5)

提前失败。

在方法的顶部进行验证,如果超过它,则可以使用(相对)安全值。

public void SomeFunction(object someParameter)
{
    if (someParameter == null) throw new ArgumentNullException("someParameter", "Value cannot be null");

    // Use the parameter here for stuff
    SomeOtherFunction(someParameter, Whichway.Up);
}

return语句也是如此。如果您的方法已经完成,请不要将内容包装在大if语句中,只需return,然后离开。

有关此概念的其他示例,请参阅reducing cyclomatic complexity。请注意,在我的示例中,只有一个代码路径,这只是您可以使用给定参数获得多远的问题。嵌套的if和大括号(即使你不使用大括号,如你的例子中)对可读性的影响也大于你的例子之间的差异。

答案 1 :(得分:3)

第一个和第二个选项等同于编译器。但是对于人类阅读代码,第一个选项肯定是更明确的意图,更容易阅读。

人类读者可以从成千上万的主要用于运作的文本行中吸收,而不是传达意义。每一项使任务变得更轻松的微小努力都是好的。

答案 2 :(得分:3)

while(something) {
    if(condition)
    {
        DoThis();
        continue;
    }
    else
        break; }

与以下内容相同:

while(something && condition)
{
     DoThis();
}

对于你的问题:最好更清楚地表明控制是如何流动的,即使它看起来多余(例如,多余的其他连接无论如何都要优化)。所以,如果(cond)返回x,则抛出y是好的。

但是如果对方法参数进行错误检查,你应该在方法的开头做所有检查,所以你不需要任何其他的。

答案 3 :(得分:1)

我想这取决于你的喜好。我个人更喜欢第一个选项,因为它不那么冗长。幸运的是Resharper和我同意这一点,所以很容易让R#更改较短版本的代码。

答案 4 :(得分:1)

为了获得更好更清晰的代码,我认为最好总是选择这种形式:

if(condition)
{
   //do stuff
}
else
{
   //do stuff
}

..等等。

这只是一个“品味”的问题,但即使你有更多的代码行,这显然是可读的,因为你不必解释也不理解,你可以轻松地用手指跟随代码流。所以,对我来说,即使返回阻止回退到下面的代码,总是其他的,如果你有一行if / else等等,总是括号事件。

据我所知,这也是Framework Design Guidelines中提出的,非常简单的书中有很多“这样做”和“不要这样做”指南。

答案 5 :(得分:1)

我认为在这种情况下,可读性是主要关注点。

如果您发现自己在同一方法中向下滚动广告,或者失去了执行流程的跟踪,则应该重写它。在上面的突破向我表明,虽然条件不是足够的检查。

它有它的用途,但要小心,你不希望团队中另一位开发人员出现一些讽刺

  

这里有龙!!!“

答案 6 :(得分:1)

Resharper会建议你使用它:

if( someCondition )
   return foo;

throw new InvalidArgumentException();

但是,这是否意味着它更好?我不知道。 就个人而言,我发现以下解决方案更加明确,因此我更喜欢它。但这只是个人选择。

if( someConditiion )
{
   return foo;
}
else
{
   throw new ....
}

关于你的'while'例子。恕我直言,你的代码示例都很糟糕。 为什么不这样写:

while( something )
{
    if( !condition ) 
        break;

    DoStuff();
}