3

嗨,我正在查看一些旧的 c# 代码,并注意到很多这样的代码:

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

我想知道是否存在需要 else 块的情况?我可以安全地将代码缩短为此而不会产生任何影响吗?

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

    SomeOtherFunction();
}

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

4

5 回答 5

5

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

于 2011-06-18T10:03:06.867 回答
3

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

于 2011-06-18T09:58:45.120 回答
1

两者完全等价。

于 2011-06-18T09:56:57.797 回答
0

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

我想我还有一些额外的想法。

首先,所示代码本质上实现了一个包装器方法 (SomeFunction),该方法用作 SomeOtherFunction 的保护子句。我会警惕这样做 - 当您的 KeySizeException 被捕获时,您不会仅仅从堆栈跟踪中知道 SomeOtherFunction 参与其中。这也意味着您无法通过对该方法的简单代码检查来了解 SomeOtherFunction 的此要求。

此外,您可能会考虑将这些类型的代码重新设计为 .Net 4.0 代码合同——它们可以提供更易于阅读的代码。

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

于 2011-06-18T10:13:26.133 回答
0

在 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(); 
} 
于 2011-06-18T10:20:23.090 回答