c# - 为什么 C# 编译器甚至不警告无限递归?

标签 c# .net recursion infinite-loop compiler-warnings

遗留应用程序在启动时处于无限循环状态;我还不知道为什么/如何(代码混淆竞赛候选人),但是关于被一遍又一遍调用的方法(从其他几种方法调用),我想,“我想知道是否有一个方法调用它是否也在调用另一个也调用它的方法?”

我想:“不,编译器能够解决这个问题,并且不允许它,或者至少发出警告!”

所以我创建了一个简单的应用程序来证明情况确实如此:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        method1();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        method2();
    }

    private void method1()
    {
        MessageBox.Show("method1 called, which will now call method2");
        method2();
    }

    private void method2()
    {
        MessageBox.Show("method2 called, which will now call method1");
        // Note to self: Write an article entitled, "Copy-and-Paste Considered Harmful"
        method1();
    }
}

...但是没有!它编译得很好。为什么编译器最多不会将此代码标记为有问题?如果按下任一按钮,您就进入了永不落地!

好吧,有时您可能想要一个无限循环(起搏器代码等),但我仍然认为应该发出警告。

最佳答案

  1. 正如您所说,有时人们想要无限循环。 .net 的 jit-compiler 支持 tailcall 优化,所以你甚至可能不会像你那样得到无限递归的堆栈溢出。

  2. 对于一般情况,在有限时间内预测程序是否会在某个时刻终止或陷入无限循环是不可能的。它叫做 halting problem .编译器所能找到的只是一些很容易决定的特殊情况。

关于c# - 为什么 C# 编译器甚至不警告无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23433648/

相关文章:

language-agnostic - 每个递归都可以转化为迭代吗?

c# - 抽象一个 List<T>,其源可以通过 C# 中的接口(interface)递归?

c# - 修改 app.config 以连接到未安装 SQL Server Management Studio 的计算机中的数据库文件

c# - 返回 IAsyncEnumerable 的方法是否有明确的命名约定?

c# - 将变量的值设置为 null 或另一个值

c# - 如何在WPF中垂直拉伸(stretch)表单时自动增加多行文本框的高度

c# - 将自定义代码放在系统 namespace 中

c# - Expression.Variable() 和 Expression.Parameter() 有什么区别?

java - 递归地对数组中的整数求和

c# - 我如何告诉 Resharper 我的 IEnumerable 方法删除了空值?