【发布时间】:2014-06-19 11:06:53
【问题描述】:
旧版应用在启动时处于无限循环中;我还不知道为什么/如何(代码混淆竞赛候选人),但关于被反复调用的方法(从其他几种方法调用),我想,“我想知道是否有一种方法调用这个是否也在调用另一个同样调用它的方法?”
我想:“不,编译器能够解决这个问题,并且不允许这样做,或者至少发出警告!”
所以我创建了一个简单的应用程序来证明是这样的:
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();
}
}
...但是没有!它编译得很好。为什么编译器最多不会将此代码标记为有问题?如果任何一个按钮被捣碎,你就永远不会落地!
好的,有时您可能想要无限循环(起搏器代码等),但我仍然认为应该发出警告。
【问题讨论】:
-
任何图形用户界面最基本的东西都是基于一个无限循环,一个事件循环。编译器确实没有理由对此发出警告,因为有很多有用的情况。而且,您的代码不会无限循环,它会被消息框打断。
-
检测到无限循环通常是无法确定的。这是赖斯定理的结果。
-
我什至不知道 Condoleeza 是一名程序员。还是说杰瑞?
-
这不是无限循环,而是无限递归。这更糟糕,因为它会导致堆栈溢出。除非您正在编写恶意软件,否则永远不需要无限递归。
-
@B.ClayShannon 这也是一个无法解决的问题。您正在尝试解决停机问题,这是一个众所周知的无法解决的问题。
标签: c# .net recursion infinite-loop compiler-warnings