我有一个User类。其中一个属性需要是“关联”用户,因此它的类型需要是User。现在,当我初始化类时,我尝试初始化Associated属性时会出现堆栈溢出。目前的代码:
public class User {
public User() {
this.Associated = new User();
}
public User Associated { get; set; }
}
这是可行的还是我在错误的树上吠叫?
答案 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
。