我有时会使用
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:是的循环示例很糟糕,因为它们是合成的(即:为这个问题编写),与第一个实际不同。
答案 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();
}