在构造函数中传递对'this'的引用

时间:2009-04-09 15:26:02

标签: c# constructor

我知道我之前已经完成了这项工作,但我认为我的构造函数的执行顺序是我认为....

public class Class1
{
    Class2 _class2;

    public Class1()
    {
        _class2 = new Class2(this);
    }
}

public class Class2 
{
    Class1 _parent; //corrected typo

    public Class2(Class1 parent)
    {
        _parent = parent;
    }
}

麻烦的是,父总是以null结束。

这样做的正确方法是什么? (也许我可以归咎于我患感冒的缓慢......)

编辑以纠正TYPO(这不是真正的代码中的问题!)

5 个答案:

答案 0 :(得分:10)

您可能输错了代码,但我认为您想要Class2的这个定义(请注意Class2构造函数中的 this 限定符):

public class Class2 
{
    Class1 parent;

    public Class2(Class1 parent)
    {
        this.parent = parent;
    }
}  

答案 1 :(得分:9)

如果您更改Class2以包含this.parent = parent;

,这在技术上应该可行

但是,我不建议这样做。相反,我会建议在class1中初始化class2实例。根据Class2构造函数中的所有操作,您可能会导致自己陷入恶劣的境地。

在class1上创建Class2属性并且延迟初始化它会导致在Class1的构造函数完成之后构造Class2,而不是在构造期间构造,如果你的类变得更复杂,那么很可能不容易出错。

答案 2 :(得分:2)

Class1 parent;
_parent = parent;
永远不会定义

_parent;你把它拼错了。

答案 3 :(得分:1)

我知道这是一个古老的问题,但我认为我会把我的两分钱扔进去。谷歌把我带到这里,所以它可能会带来其他人。

这可疑看起来像一个循环依赖...它有两个独立的类使用/引用彼此的代码气味。

如果您想拥有对象的父/子关系,请考虑为您的类创建二叉树实现(或类似)。

如果您想利用类继承,请正确使用> Class2Class1的基类,您的Class1声明为public class Class1 : Class2。您可以使用Class2关键字在Class1中引用base方法。

简而言之,这个答案是:你需要重新设计你的课程以更好地适应你想要完成的事情,而不是让编译器去做一些比它需要的更令人困惑的事情。 。

特别是因为您要对此进行测试的代码可能正在新增Class1,然后查询该对象以引用Class2对{Class1的引用1}} ......这绝对没有意义。

Append2:

从语义上讲,Class1可以按如下方式重写:

public class Class1
{
    Class2 _class2;

    public Class1()
        :this(new Class2(this))
    {
    }
    public Class1(Class2 class2)
    {
        _class2 = class2;
    }
}

...除了它之外,因为:this(new Class2(this))语法是正确的。它也正是你正在做的事情。请不要。

答案 4 :(得分:0)

我不明白为什么这不起作用。它适用于我。

宣称: http://vvcap.net/db/I2OZoapbIRREvQ8ymPym.htp

走了过来: http://vvcap.net/db/ehsYqCY6JByqZQq-RXGp.htp

这是结果: http://vvcap.net/db/ZWjqb_Yv1yAisX0BYUns.htp