2011-09-30 74 views
5

我有一个用户类。其中一个属性需要是“关联”用户,因此它的类型需要为User。现在,当我初始化这个类时,当它尝试初始化Associated属性时,会发生堆栈溢出。当前代码:在自己的构造函数中初始化一个新类

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

    public User Associated { get; set; } 
} 

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

+1

为什么不能为您的关联用户的有效默认值? – user957902

+0

即使对于未关联的用户,在我所需的关联User类中还有其他默认值。 –

回答

4

你可以使用延迟加载的方法为您汇总User类,并在构造函数中未初始化:

public class User { 
    private User _user; 

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

接受为我提供我需要的解决方法。谢谢。 –

1

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

2

您正在递归调用User构造函数。每当您无限期地(或更确切地说,广告StackOverflowExceptionnew一个User,它new的另一个User

1

问题是,你已经开发了一个无限循环的新用户。每个新用户都会获得一位新用户作为员工。

我会从默认的构造函数中删除该分配,然后将其作为公共属性添加。这样做可以让您控制何时分配联系人,并防止无限循环。

8

User.Associated是否必须在施工时填充?如果你从构造函数中删除了这个赋值,你就不应该得到它。

你得到一个SO的原因是因为当你构建一个User()时,它构造了一个User(),这反过来构成了一个User(),它一直是乌龟。

+1

对于一个好的答案和海龟比喻+1! –

1

调用构造内部构造带你到一个无限循环:

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

你可以做这样的事情:

public class User { 
    public User() { 

    } 

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

    public User Associated { get; set; } 
} 

,并调用AddAssociatedUser当你需要它。

相关问题