【问题标题】:Passing objects into constructor before initialised在初始化之前将对象传递给构造函数
【发布时间】:2011-09-13 10:48:02
【问题描述】:

我有以下问题。这是我拥有的一些类的一个简单示例(每个类都依赖于其他类)。

public Class1()
{
  public Class1(Class2 class2)
 {

 }
}

public Class2()
{
  public Class2(Class3 class3)
 {

 }
}

public Class3()
{
 public Class1 class1;
 public Class3(Class1 class1)
 {
     this.class1 = class1;
 }
}

然后我有以下代码初始化对象。

Class1 class1 = null;
Class2 class2 = null;
Class3 class3 = null;

class3 = new Class3(class1);
class2 = new Class2(class3);
class1 = new Class1(class2);

Assert.IsNotNull(class3.class1)

我遇到的问题是断言始终为空,即使 class1 已被初始化。我确实有一个条件是我只想创建每个类的一个实例。

任何人都可以建议确保断言通过的最佳方法。

【问题讨论】:

    标签: c# vb.net class pass-by-reference


    【解决方案1】:

    最初,class1 变量是一个空指针。然后你给它赋值,reference 就会改变。但是class3.class1仍然指向null。

    您需要确保引用不会改变,但它指向的值会改变。

    【讨论】:

    • 是的@David 我忘记了引用这个词并使用了看起来模棱两可的指针。我正在解决这个问题:P
    【解决方案2】:

    class1在创建class3时没有初始化为它的对象,所以class3的实例为null。

    让这个测试通过的正确方法是:

    Class1 class1 = null;
    Class2 class2 = null;
    Class3 class3 = null;
    
    class1 = new Class1();
    class3 = new Class3(class1);
    class2 = new Class2(class3);
    class1.Class3 = class3;
    
    Assert.IsNotNull(class3.class1)
    

    【讨论】:

      【解决方案3】:

      class1 调用时为空:

      class3 = new Class3(class1);
      

      因此断言自然而然地失败了。您需要先实例化 class1,然后再尝试将其传递给 Class3 构造函数。

      现在,由于您有循环引用,因此实现这一目标并非易事。因此,您需要做的是首先创建对象,然后修复引用。将构造与对其他对象的引用的分配分离。

      此外,您不应将对象实例命名为class,因为它们是对象而不是类。区别很重要。

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        相关资源
        最近更新 更多