C#类构造函数创建无限循环

时间:2018-11-26 20:10:17

标签: c# visual-studio

所以可以说我有两个班级。这样的A级和B级:

Class A
{
    B classB;

    public A
    {
        classB = new B();
    }

    public void funcIHaveToUseInClassB()
    {
    }
}

Class B
{
    A classA;

    public B
    {
        classA = new A();
    }

    public void funcIHaveToUseInClassA()
    {
    }
}

您可以看到两个类都包含需要在另一个类中使用的函数。 A类具有B类必须使用的功能,反之亦然。不,我不能仅仅将函数放在另一个类中,因为它们严重依赖于当前所在的类。那么我该怎么做呢?使用我的方法,我创建了一个无限循环并获得了堆栈溢出异常。我希望有人能帮助我,谢谢。

编辑: 人们在问我为什么我需要这两个类互相依赖,所以这里是:A类管理与WebBrowser控件有关的所有事情,而B类管理与程序中某个页面有关的所有事情。类A被多个页面使用,这就是它需要是单独的类的原因。 A类有时需要将信息推送到B类。B类有时需要来自WebBrowser控件的信息,而A类正在管理,这就是为什么它调用函数的原因。

4 个答案:

答案 0 :(得分:1)

您需要将一个类的实例传递给另一个类的构造函数。 试试这个:

Class A
{
    B classB;

    public A()
    {
        classB = new B(this);
    }

    public void funcIHaveToUseInClassB()
    {
    }
}

Class B
{
    A classA;

    public B(A arg)
    {
         classA = arg;
    }

    public void funcIHaveToUseInClassA()
    {
    }
}

更新

或者只是将实例作为参数传递给Matt Mattsen的答案中的方法。

答案 1 :(得分:0)

创建一个私有和公共访问器,并仅在私有对象为null时实例化属性,如下所示:

class A
{
  private B _b;
  public B b {
    get {
      if (_b == null) _b = new B();
      return _b;
    }
  }

  // Constructor can now be empty
  public A()
  {
  }
 }

答案 2 :(得分:0)

每次需要使用参考文献时,请将其从B / A传递到A / B。您不需要构造函数。

Class A
{
    public void funcIHaveToUseFromClassB(B classB)
    {
    }
}

Class B
{
    public void funcIHaveToUseFromClassA(A classA)
    {
    }
}

答案 3 :(得分:0)

将classB和classA设置为公共属性,然后从另一个类而不是构造函数对其进行初始化。

class A
{
  public B classB { get; set; }

  public void funcIHaveToUseInClassB()
  {
  }

  public void anotherF()
  {
     classB.funcIHaveToUseInClassA();
  }
}

class B
{
   public A classA { get; set; }

   public void funcIHaveToUseInClassA() 
   {
   }

   public void anotherF()
   {
      classA.funcIHaveToUseInClassB();
   }
}


static void main()
{
    // entry point
    var a = new A();
    var b = new B();
    a.classB = b;
    b.classA = a;
    // do what ever you want with a and b
}