C# - 确定类初始化是否导致无限递归?

Joh*_*n M 0 c# .net-3.5 winforms

我正在努力将VB6应用程序移植到C#(Winforms 3.5),同时我正在尝试将功能分解为各种类(即数据库类,数据验证类,字符串操作类).

现在,当我尝试在调试模式下运行程序时,程序暂停,然后崩溃并发生StackOverFlowException.VS 2008表明无限递归原因.

我一直试图追踪可能导致这种递归的原因,现在我唯一的假设是类初始化(我在每个类的标题(?)中做).

我的想法是这样的:

  • mainForm初始化classA
  • classA初始化classB
  • classB初始化classA
  • ....

这有意义还是我应该在别处寻找?

UPDATE1(代码示例):

的MainForm

namespace john
{
    public partial class frmLogin : Form
    {
    stringCustom sc = new sc();
Run Code Online (Sandbox Code Playgroud)

stringCustom

namespace john
{
   class stringCustom
   {
       retrieveValues rv = new retrieveValues();
Run Code Online (Sandbox Code Playgroud)

retrieveValues

namespace john
{
    class retrieveValues
    {
    stringCustom sc = new stringCustom();
Run Code Online (Sandbox Code Playgroud)

Aar*_*ght 5

10次​​中有9次,无限递归错误是由不良属性访问器引起的:

public class BrokenClass
{
    private string name;

    public string Name
    {
        get { return name; }
        set { Name = value; }  // <--- Whoops
    }
}
Run Code Online (Sandbox Code Playgroud)

在使用方法重载进行重大重构时,我也遇到过这种情况; 有时候,当它应该调用不同的重载方法时,你会不小心结束调用自身的方法.

无论哪种方式,您都应该能够通过查看异常的调用堆栈并检查重复模式来判断.如果你看到一个,那么你的问题就在那个循环中.

编辑 - 好吧,根据您的示例代码,您肯定在初始化程序中有无限递归.我不知道该代码应该做什么,但它永远不会终止. StringCustom立即创建RetrieveValues立即创建另一个StringCustom,依此类推.

这是循环类依赖性通常被认为是代码气味的一个原因.每当你看到ClassA依赖ClassBClassB依赖于ClassA那时你应该尝试重构; 例外情况是如果ClassB完全由ClassA(即内部类)拥有和管理,这显然不是这里的情况.您需要以某种方式消除其中一个依赖项.