嗨,我在看一些旧的c#代码,注意到有很多这样的代码:
void SomeFunction()
{
if (key.Length != Dimensions)
{
throw new KeySizeException();
}
else
{
SomeOtherFunction();
}
}
我想知道是否有必要使用其他块的情况?我可以安全地将代码缩短为这样而不会产生任何影响吗?
void SomeFunction()
{
if (key.Length != Dimensions)
{
throw new KeySizeException();
}
SomeOtherFunction();
}
默认情况下,异常应该将程序流抛出此方法,对吗?但我只是想知道DotNet中是否有一种方法可以调整未处理异常的处理方式,这会导致第二个实现与第一个不同?
您不需要'else'块。它是多余的。如果您使用像"重塑者"或"JustCode"这样的重构工具,通常会指出这些冗余的代码元素。
throw
是该代码块中的显式终端,方法调用将有效地在该点结束。这意味着else
块是冗余的并且可以被移除。
两者完全等价。
正如其他人所说,这两段代码是等效的。
不过我想我还有其他想法。
首先,如图所示的代码本质上实现了一个包装器方法(SomeFunction),该方法用作SomeOtherFunction的保护子句。我会小心这样做——当你的KeySizeException被捕获时,你根本不会从堆栈跟踪中知道SomeOtherFunction参与其中。这也意味着,通过对SometerFunction的简单代码检查,您无法看到该方法的此需求。
此外,您可能会考虑将这些类型的代码重新构造为.Net 4.0代码契约——它们可以使代码更易于阅读。
最后想一想——在像你这样的情况下,我有时会忍不住离开其他人。这让其他人100%清楚地知道if/else行为是有意的。
在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();
}