您好我正在查看一些旧的c#代码并注意到很多这样的代码:
void SomeFunction()
{
if (key.Length != Dimensions)
{
throw new KeySizeException();
}
else
{
SomeOtherFunction();
}
}
我想知道是否有一种情况甚至需要使用else块?我能否安全地将代码缩短到此而没有任何影响?
void SomeFunction()
{
if (key.Length != Dimensions)
{
throw new KeySizeException();
}
SomeOtherFunction();
}
默认情况下,异常应该抛出这个方法的程序流吗?但我只是想知道DotNet中是否有办法调整未处理的异常是如何处理的,这会导致第二个实现与第一个实现不同?
答案 0 :(得分:5)
答案 1 :(得分:3)
throw
是该代码块中的显式终端,方法调用将在该点有效结束。这意味着else
块是多余的,可以删除。
答案 2 :(得分:1)
两者完全等效。
答案 3 :(得分: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();
}
答案 4 :(得分:0)
正如其他人所说,这两段代码是等价的。
我觉得我还有一些额外的想法。
首先,所示的代码基本上实现了一个包装器方法(SomeFunction),它作为SomeOtherFunction的保护子句。我会警惕这样做 - 当你的KeySizeException被捕获时,你不会从堆栈跟踪中知道SomeOtherFunction完全参与其中。这也意味着您无法通过对该方法的简单代码检查来了解SomeOtherFunction的这一要求。
此外,您可以考虑将这些类型的代码重构为.Net 4.0代码合同 - 它们可以更容易地阅读代码。
最后的想法 - 在像你这样的情况下,我有时会想要离开别人。这使得其他人100%清楚if / else行为是有意的。