代码之家  ›  专栏  ›  技术社区  ›  Rush Frisby

属性导致的Stackoverflow异常

  •  1
  • Rush Frisby  · 技术社区  · 14 年前

    我有一个User类,它有一个名为Creator的属性,该属性的类型为User(创建此用户的用户)

    public class User {
    
        public User()
        {
            UserName = "";
            EmailAddress = "";
        }
    
        public String UserName { get; set; }
        public String EmailAddress { get; set; }
        //bunch of other properties
    
        public User Creator { get; set; }
    }
    

    我在UserName=“;”行遇到Stackoverflow异常;。我认为这是因为Creator属性陷入了一个大循环。如果我没有将Creator设置为新用户,为什么会发生这种情况?我有办法阻止这一切发生吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   myermian    14 年前

    我猜你是在以某种方式初始化Creator,这会导致创建无限数量的用户,从而导致StackoverflowException。

    下面是一个例子,可以得出这样的结论:

    public List<User> CreatUsers()
    {
        List<User> users = new List<User>;
    
        //Some DB call to get a list of users
        foreach (var record in userlist)
            List.Add(CreatUser(record));
    }
    
    public User CreateUser(?? record)
    {
        User user = new User();
        //Set properties
        if (record has creator) //pseudo-code
            user.Creator = CreatUser(record.Creator); //guessing as to record.Creator
    }
    
    public class User
    {
        public User()
        {
            UserName = "";          //Stackoverflow on this line.
            EmailAddress = "";
        }
    
        public String UserName { get; set; }
        public String EmailAddress { get; set; }
    
        public User Creator { get; set; }
    }
    //{Cannot evaluate expression because the current thread is in a stack overflow state.}
    

    实际上,我不知道该怎么解决,因为很难猜出他的代码,哈哈。

        2
  •  3
  •   Scott Chamberlain    14 年前

    我赌你的钱 UserName 塞特看起来像这样

    public string UserName
    {
        get { return UserName; }
        set { UserName = value; }
    }
    

    这导致了内接递归。你要么把它设计成 Creator 你拥有的财产,或者这样做

    private string _UserName;
    public string UserName
    {
        get { return _UserName; }
        set { _UserName = value; }
    }
    

    编辑:

    我怀疑 造物主 属性与此问题有关,因为该值在构造函数中仅为空

        3
  •  1
  •   Rush Frisby    14 年前

    我有一个用户,创建者就是它自己。我想是数据问题而不是代码问题。不管怎样,谢谢你看这个。