【问题标题】:Is there a way to indicate that a method will never return? [duplicate]有没有办法表明一个方法永远不会返回? [复制]
【发布时间】:2018-03-28 16:37:12
【问题描述】:

假设我们有以下(非常基本的代码)

public int Foo()
{
    while (true)
    {

    }
    // No "return 0" etc. needed here.
}

编译器可以理解该方法永远不会返回,因此会显示警告,并且它不需要该方法具有return 语句。


如果有的话

public void WontExit()
{
    while (true)
    {

    }
}

public int Foo()
{
    this.WontExit();
    return default(int); // This is needed here.
}

需要return 语句,因为编译器似乎无法预见它永远不会到达。


  • 为什么编译器允许在第一种情况下省略return 语句?为什么它也不需要return 声明? (这里的内部结构是什么?)
  • 有什么方法可以指示编译器(或可达性分析)在第二种情况下,return 代码路径也永远无法到达?

【问题讨论】:

  • 为什么this.WontExit() 在典型操作中不会退出?这是绝对保证的吗?
  • 顺便说一句,给定的代码可以退出;即通过异常
  • 在实际代码中绝对保证,因为它会在所有代码路径上throw
  • 我同意:在 while 循环中可能有一个 return 语句可以退出函数,因此编译器很难保证它总是无限运行.
  • @JackBrown 你是对的,这就是为什么我想知道 C++ 中是否有类似[[noreturn]] 的东西,它可以用于程序员知道代码永远不会返回的情况。

标签: c#


【解决方案1】:

为什么编译器允许在第一种情况下省略 return 语句?

因为最终的} 无法访问。这是编译器阻止的条件(并且在规范中):永远能够到达非 void 方法的末尾。

有什么方法可以指示编译器(或可达性分析)在第二种情况下,return 语句也永远不会到达?

不,很遗憾。有很多时候是有用的(它被定义为“这个方法永远不能返回正常,即不抛出异常”),但它没有 C# 功能。我相信 Eric Lippert 会在某个时候发布有关此的博客……会尝试找到该文章。

【讨论】:

  • 你可能会想到this one,它在欺骗问题的cmets中链接。
  • @JeroenMostert:结束了,是的 - 但我认为还有一个更详细的。那好吧。尽管它是重复的,但我会在这里留下这个答案;特别是第一部分略有不同。
  • 您可能会想到我为 Coverity 博客写的一篇类似文章,该文章已被撤下。
  • @EricLippert:让我们假设这是我正在考虑的那个,因为它是合理的并且避免我不得不进一步研究:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
相关资源
最近更新 更多