在自己的构造函数中初始化一个新类

时间:2011-09-30 15:15:10

标签: c# properties class-design

我有一个User类。其中一个属性需要是“关联”用户,因此它的类型需要是User。现在,当我初始化类时,我尝试初始化Associated属性时会出现堆栈溢出。目前的代码:

public class User {
    public User() {
        this.Associated = new User();
    }

    public User Associated { get; set; }
}

这是可行的还是我在错误的树上吠叫?

6 个答案:

答案 0 :(得分:8)

User.Associated是否必须在构造中填充?如果从构造函数中删除赋值,则不应该得到SO。

你得到一个SO的原因是因为当你构造一个User()时,它会构造一个User(),而User()反过来构造一个{{1}}并且它一直是乌龟。

答案 1 :(得分:4)

您可以为聚合的User类使用延迟加载的方法,而不是在构造函数中初始化它:

public class User {
    private User _user;

    public User Associated 
    { 
        get
        {
            if (_user == null)
                _user = new User();
            return _user;
        }
    }
}

答案 2 :(得分:2)

您正在递归调用User构造函数。每当您new User时,new会另外User无限广告(或更确切地说,广告StackOverflowException)。

答案 3 :(得分:1)

不要在构造函数中初始化Associated成员。如果你只在需要时初始化它,我认为堆栈溢出应该消失。

答案 4 :(得分:1)

问题是你已经开发了无限循环的新用户。每个新用户都将新用户作为员工。

我会从默认构造函数中删除该assignement,然后将其添加为公共属性。执行此操作将允许您控制何时分配关联,并将阻止无限循环。

答案 5 :(得分:1)

在构造函数中调用构造函数会导致无限循环:

创建新的User实例 - >创建新的User实例 - >创建新的User实例 - >创建新的User实例 - >创建新的User实例 - >创建一个新的User实例...

你可以这样做:

public class User {
    public User() {

    }

    public AddAssociatedUser() {
        this.Associated = new User();
    }

    public User Associated { get; set; }
}

并在需要时致电AddAssociatedUser