为什么C#编译器甚至没有警告无休止的递归?

为什么C#编译器甚至没有警告无休止的递归?,第1张

概述遗留应用程序在启动时处于无限循环中;我不知道为什么/如何(代码混淆竞赛候选人),但关于被反复调用的方法(从其他几种方法调用),我想,“我想知道是否有一种调用此方法的方法还在调用另一个也叫它的方法?“ 我想:“不,编译器能够解决这个问题,而不是允许它,或者至少发出警告!” 所以我创建了一个简单的应用来证明这种情况: public partial class Form1 : Form{ pu 遗留应用程序在启动时处于无限循环中;我不知道为什么/如何(代码混淆竞赛候选人),但关于被反复调用的方法(从其他几种方法调用),我想,“我想知道是否有一种调用此方法的方法还在调用另一个也叫它的方法?“

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

所以我创建了一个简单的应用来证明这种情况:

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();    }}

…但不是!它编译得很好.为什么编译器不会将此代码标记为最可疑?如果任何一个按钮被捣碎,你就永远不会降落!

好的,有时您可能需要无限循环(起搏器代码等),但我认为应该发出警告.

解决方法 这不是无限循环,而是无休止递归.这更糟糕,因为它们可能导致堆栈溢出.除非您编写恶意软件,否则大多数语言都不需要无限递归.然而,无尽的循环通常是有意的.服务通常以无限循环运行.

为了检测这种情况,编译器必须按照方法调用来分析代码;但是C#编译器将此过程限制为当前方法中的直接代码.例如,这里可以跟踪未初始化或未使用的变量,并且可以检测不可达的代码.在编译速度和静态分析和优化的深度之间需要权衡.

此外,几乎不可能知道程序员的真实意图.

想象一下,你写了一个完全合法的方法.突然因为你从另一个地方调用这个方法,你的编译器会抱怨并告诉你你的方法不再合法.我已经可以在SO上看到大量的帖子了:“我昨天编译的方法.今天它不再编译了.但我没有改变它”.

总结

以上是内存溢出为你收集整理的为什么C#编译器甚至没有警告无休止的递归?全部内容,希望文章能够帮你解决为什么C#编译器甚至没有警告无休止的递归?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243292.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存