在其自身构造函数中初始化一个新类

5

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

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

    public User Associated { get; set; }
}

这个可行吗,还是我在打错方向?


1
为什么 null 不能作为关联用户的有效默认值? - user957902
即使对于未关联的用户,相关的用户类中还有其他默认值我需要使用。 - Michael Itzoe
6个回答

8

在构造函数中是否必须填写User.Associated?如果从构造函数中删除此赋值,则不应该出现SO错误。

之所以会出现SO错误,是因为当你构造一个时,它会构造一个,然后又会构造一个, 如此循环往复。


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

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

2
您正在递归调用User构造函数。每次您new一个User,它就会无限制地new另一个User(或者说,遇到StackOverflowException异常)。

1

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

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

你可以像这样做:

public class User {
    public User() {

    }

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

    public User Associated { get; set; }
}

当你需要时,调用 AddAssociatedUser 方法。


1

不要在构造函数中初始化关联成员。如果只有在需要时才初始化它,我认为堆栈溢出问题应该就会消失。


1
问题在于您已经开发了一个无限循环的新用户。每个新用户都会得到一个新用户作为关联。
我建议从默认构造函数中删除分配,然后将其添加为公共属性。这样做可以让您控制何时分配关联,并防止无限循环的情况发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接