0

我有时用

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

其他时候我用

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

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

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

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

相对

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

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

4

7 回答 7

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然后离开那里。

有关此概念的其他示例,请参阅降低圈复杂度。请注意,在我的示例中只有一个代码路径,这只是使用给定参数可以走多远的问题。嵌套if的 s 和大括号(即使您不使用大括号,如您的示例中那样)都比示例之间的差异对可读性的影响更大。

于 2009-09-22T10:33:05.503 回答
3

第一个和第二个选项等效于编译器。但是对于阅读代码的人来说,第一个选项肯定更清楚意图,更容易阅读。

人类读者可以从数千行主要用于功能而非传达意义的文本中吸收的内容是有限的。使任务更容易的每一个微小的努力都是好的。

于 2009-09-22T10:37:08.843 回答
3
while(something) {
    if(condition)
    {
        DoThis();
        continue;
    }
    else
        break; }

与以下相同:

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

对于您的问题:即使控制看起来是多余的,最好还是更明确地说明控制的流动方式(例如,多余的其他连接无论如何都会被优化掉)。所以 if (cond) return x else throw y 是好的。

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

于 2009-09-22T11:03:46.297 回答
1

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

于 2009-09-22T10:34:22.623 回答
1

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

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

..等等。

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

据我记得,框架设计指南中也建议了这一点,这是一本非常简单的书,里面有很多“做这个”和“不做这个”的指南。

于 2009-09-22T10:34:46.023 回答
1

我认为在这种情况下,可读性是主要问题。

如果您发现自己以相同的方法向上滚动广告,或者忘记了执行流程,则可能应该重写它。上面的中断向我表明,while 条件不是足够的检查。

它有它的用途,但要小心,你不希望团队中的其他开发人员发表一些评论说

这里有龙!!!

于 2009-09-22T10:35:44.010 回答
1

Resharper 会推荐你使用这个:

if( someCondition )
   return foo;

throw new InvalidArgumentException();

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

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

关于您的“同时”示例。恕我直言,您的两个代码示例都很糟糕。为什么不这样写:

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

    DoStuff();
}
于 2009-09-22T10:36:33.383 回答