2011-10-06 50 views
0

有什么办法告诉C#编译器一个函数永远不会返回?我遇到了以下问题。这是简单的简化版本。指定函数不返回在C#

public int myMethod() 
{ 
    try 
    { 
     return anythingHere(); 
    } 
    catch 
    { 
     Environment.Exit(1); //or a function which always either calls Environment.Exit or throws an exception 
    } 
} 

'package.class.myMethod()'不是所有的代码路径都返回一个值。

如果不是,有没有一种通用的方法来框架这种事情,而不是插入无法访问的代码?在退出之后有一个'返回0'或者其他一些对我来说似乎很荒谬。据我所知,没有办法可以从Environment.Exit调用返回函数,所以如果该分支被采用则不需要返回值(如果它抛出异常,该函数仍然不需要返回值)。

编辑:

也许这样的事?

public T MyExit<T>() 
{ 
    Environment.Exit(1); 
    return default(T); 
} 

虽然还不完全令人满意。

+2

我实在不明白的危害在把回报的,如果它永远不会得到点击,希望编译器看到,但这可能是在编译 –

+1

优化通过耶稣和SLak的都是正确的,但我担心的是,如果这是一个问题,你试图通过这种方式来解决,也许它的你的架构需要一点反思。一种设计用于返回事物的方法应该总是返回一些东西如果没有,那么我认为你的退出逻辑在错误的地方......如果你明白我的意思。最上面的来电者应该决定是否需要退出。不是函数调用。 –

+0

@RussC值得关注。在我的特殊情况下,执行catch块是一个不可恢复的错误,我想要注意,但最终会退出程序。 – Lucina

回答

1

抛出异常比调用Environment.Exit更好。如果其他人使用过你的课程,并且他们的流程突然关闭,他们会很惊讶。通过抛出异常,你至少可以解释为什么会发生问题。

在应用程序的顶层入口点(即Main),您可以设置全局异常处理程序(AppDomain.UnhandledException)来处理所有异常并调用Environment.Exit。

+0

这是我最终做的。没有理由让我的程序继续下去,因为这意味着我的数据无效,但它更易于抛出异常,然后捕获它们并在更高级别上死亡。也正如你所提到的,如果我将来使用,如果我不再需要它们,我不必回头去除这些杀戮开关。 – Lucina

0

让它成为一个空格,而不是int。

public void myMethod(out int i) 
{ 
    try 
    { 
     i = anythingHere(); 
    } 
    catch 
    { 
     Environment.Exit(1); 
    } 
} 
2

使该方法无效,并传入包含“anythingHere”类型的信息,你需要为出类型,以便它可以设置一个对象,但该方法本身实际上不会返回任何东西。

public void myMethod(out anythingObject) 
{ 
    try 
    { 
     anything = new anythingObject(stuff goes here); 
    } 
    catch 
    { 
     Environment.Exit(1); //or a function which always either calls Environment.Exit or throws an exception 
    } 
} 
+0

这给了我'out参数'variableName'必须在控制离开当前方法之前分配给'。它朝着正确的方向迈出了一步。我想我可以将它设置为默认的方法的第一行。 – Lucina

+0

这使得该方法_much_更令人讨厌使用。它也无济于事。 – SLaks

+0

@Mike:与添加'return'有什么不同? – SLaks

1

我不知道这是否是你要找的是什么,但是这将避免可达代码:

public int myMethod() 
{ 
    int retVal = 0; 
    try { 
    retVal = anythingHere(); 
    } catch { 
    Environment.Exit(1); 
    } 
    return retVal; 
}