【问题标题】:Stackoverflow Exception caused by property由属性引起的 Stackoverflow 异常
【发布时间】:2010-11-17 16:02:09
【问题描述】:

我有一个 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 设置为新用户,为什么会发生这种情况?有没有办法阻止这种情况发生?

【问题讨论】:

  • UserNameEmailAddress 属性是什么样的?
  • 您需要发布 1) 编译 2) 重现错误的代码
  • 请检查您如何实现 UserName 或 UserName 引用的任何属性。如果可能,请在此处发布代码。
  • 需要 UserName 和 EmailAddress 属性的代码,而不是 Creator 属性...
  • 从控制台应用程序创建此用户对我来说很好。

标签: c# recursion properties stack-overflow


【解决方案1】:

我敢打赌你的UserName Setter 看起来像这样

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

这导致了无限递归。您需要像您拥有的 Creator 属性一样设计它,或者这样做

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

编辑:

我怀疑 Creator 属性与该问题有什么关系,因为该值在构造函数中只是 null

【讨论】:

  • 这确实引入了一个 SO 异常。但是在属性设置器中,而不是在构造函数中的 UserName = "" 上,如问题中所述。
【解决方案2】:

我的猜测是您正在以某种方式初始化 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.}

实际上,我不知道如何修复它,因为很难猜出他的所有代码,哈哈。

【讨论】:

  • 好吧,显然他回答了自己的问题,说他在创建自己的创建者用户时正在做一些循环。起初我想不出为什么这会是一个问题,因为 user.Creator = user; 不应该是一个问题,但现在我可以看到他创建了该 SAME 用户的另一个实例以将其设置为创建者,他一遍又一遍地做,而不是使用同一个用户对象。所以他的问题在于他没有发布的代码。大声笑。
  • 哦,我猜对了,除了我猜他的Creator = new User() 不在构造函数中,而是在他创建用户的数据循环中。我将更新我的帖子,以展示他可能是如何做到的以及他应该如何解决它。
【解决方案3】:

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

【讨论】:

  • 我还是会说这是代码问题。代码应该是防御性的并优雅地处理这样的数据问题。
  • 我不明白为什么会导致 Stackoverflow。我可以做到以下没有问题。 User user = new User(); user.Creator = user;
  • @Richard 我同意。我正在添加一些额外的检查,以便在这种情况下停止递归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
相关资源
最近更新 更多