2011-06-18 49 views
3

嗨,我是在看一些旧的C#代码,并注意到这样一个大量的代码抛出else块甚至是必要的?我可以安全地缩短代码而不会产生影响吗?程序流程C#

void SomeFunction() 
{ 
    if (key.Length != Dimensions) 
    { 
     throw new KeySizeException(); 
    } 

    SomeOtherFunction(); 
} 

默认情况下,异常应该抛出程序流出这种方法吧?但是我只是想知道DotNet是否有办法调整未处理的异常如何处理,这会导致第二个实现与第一个实现的工作方式不同?

+0

在技术上它们是相同的。你可以根据可读性来决定。有些人发现其他的艾滋病阅读。 –

+0

干杯,我个人觉得没有它更可读。由于这个旧代码遍地乱放,我开始怀疑是否可能有重写它的副作用。 – CodeAndCats

回答

5

你不需要'else'块。这是多余的。如果使用“Reshaper”或“JustCode”这样的重构工具,通常会指出这样的冗余代码元素。

+0

太棒了,我不认为会有改变它的副作用,但是看到它在我继承的代码中反复完成,让我感到惊讶。知道重构工具指出这只是我想要的保证,谢谢。 – CodeAndCats

1

这两者完全等价。

3

throw是该代码块中的显式终端,该方法调用将在该点有效结束。这意味着else块是多余的,可以删除。

0

正如其他人所说的那样,这两段代码是等同的。

虽然我想我会有一些额外的想法。

首先,所示的代码实质上实现了一个包装器方法(SomeFunction),该方法作为SomeOtherFunction的保护子句。我会小心这样做的 - 当你的KeySizeException被捕获时,你不会仅仅从StackOtherFunction所涉及的堆栈跟踪中知道。这也意味着通过对该方法进行简单的代码检查,您无法看到SomeOtherFunction的这一要求。

此外,您可能会考虑将这些类型的代码转换为.Net 4.0代码合同 - 它们可以更轻松地阅读代码。

最后的想法 - 在像你这样的情况下,我有时试图离开别人。这使得其他人100%清楚if/else行为是有意的。

+0

当然,我猜你的真实代码看起来与你的例子有很大不同 - 如果是这样,请忽略:) –

+0

嗨,大卫感谢您的建议。尽管你在评论中是正确的,但我只是在这个例子中弄虚作假,真正的代码是不同的。 – CodeAndCats

1

在C#中都以相同的方式工作。我认为你在想如果你处理异常(而不是抛出它),如何摆脱执行第二个陈述?

void SomeFunction() 
{  
    if (key.Length != Dimensions)  
    { 
     throw new KeySizeException(); //Halt the execution of SomeFunction method 
    } 
     SomeOtherFunction(); 
} 

如果您处理并不想执行SomeOtherFunction,您可以返回如下。

void SomeFunction() 
{  
    if (key.Length != Dimensions)  
    { 
     HandleMyException(); 
     return; // Returns and halt the execution of SomeFunction method. 
    } 
     SomeOtherFunction(); 
} 
+0

谢谢,但不,我不是:) – CodeAndCats