C# 属性导致的Stackoverflow异常
我有一个用户类,它有一个名为Creator的属性,该属性的类型为User(创建此用户的用户)C# 属性导致的Stackoverflow异常,c#,recursion,properties,stack-overflow,C#,Recursion,Properties,Stack Overflow,我有一个用户类,它有一个名为Creator的属性,该属性的类型为User(创建此用户的用户) 我在UserName=“”;”行上遇到Stackoverflow异常;。我假设这是因为Creator属性陷入了一个大循环。如果我没有将Creator设置为新用户,为什么会发生这种情况?有什么办法可以阻止这种情况发生吗?我打赌你的用户名设置器是这样的 public string UserName { get { return UserName; } set { UserName = val
我在UserName=“”;”行上遇到Stackoverflow异常;。我假设这是因为Creator属性陷入了一个大循环。如果我没有将Creator设置为新用户,为什么会发生这种情况?有什么办法可以阻止这种情况发生吗?我打赌你的
用户名设置器是这样的
public string UserName
{
get { return UserName; }
set { UserName = value; }
}
这导致了infinate递归。您需要像您拥有的Creator
属性那样设计它,或者这样做
private string _UserName;
public string UserName
{
get { return _UserName; }
set { _UserName = value; }
}
编辑:
我怀疑Creator
属性与此问题有任何关系,因为该值在构造函数中将仅为null我打赌您的用户名设置器如下所示
public string UserName
{
get { return UserName; }
set { UserName = value; }
}
这导致了infinate递归。您需要像您拥有的Creator
属性那样设计它,或者这样做
private string _UserName;
public string UserName
{
get { return _UserName; }
set { _UserName = value; }
}
编辑:
我怀疑Creator
属性与此问题有任何关系,因为该值在构造函数中将仅为null我有一个用户,其中Creator本身就是。我想这是数据问题,不是代码问题。不管怎样,感谢您的关注。我有一个用户,其创建者就是自己。我想这是数据问题,不是代码问题。无论如何,感谢您的关注。我猜您正在以某种方式初始化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.}
公共列表创建用户()
{
列表用户=新列表;
//一些数据库调用以获取用户列表
foreach(userlist中的var记录)
列表.添加(创建用户(记录));
}
公共用户CreateUser(??记录)
{
用户=新用户();
//设置属性
if(记录有创建者)//伪代码
user.Creator=CreatUser(record.Creator);//猜测record.Creator
}
公共类用户
{
公共用户()
{
UserName=“;//此行上存在堆栈溢出。
电子邮件地址=”;
}
公共字符串用户名{get;set;}
公共字符串电子邮件地址{get;set;}
公共用户创建者{get;set;}
}
//{无法计算表达式,因为当前线程处于堆栈溢出状态。}
实际上,我不知道如何修复它,因为很难猜出他的所有代码,哈哈。我猜你是在初始化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.}
公共列表创建用户()
{
列表用户=新列表;
//一些数据库调用以获取用户列表
foreach(userlist中的var记录)
列表.添加(创建用户(记录));
}
公共用户CreateUser(??记录)
{
用户=新用户();
//设置属性
if(记录有创建者)//伪代码
user.Creator=CreatUser(record.Creator);//猜测record.Creator
}
公共类用户
{
公共用户()
{
UserName=“;//此行上存在堆栈溢出。
电子邮件地址=”;
}
公共字符串用户名{get;set;}
公共字符串电子邮件地址{get;set;}
公共用户创建者{get;set;}
}
//{无法计算表达式,因为当前线程处于堆栈溢出状态。}
实际上,我不知道如何修复它,因为很难猜出他的所有代码,哈哈。用户名和电子邮件地址的属性是什么样子的?你需要发布1)编译2)复制错误的代码。请检查你是如何实现用户名或用户名引用的任何属性的。如果可能的话,请在此处发布代码。需要用户名和电子邮件地址属性的代码,而不是创建者属性…从控制台创建此用户对我来说很好。UserName
和EmailAddress
属性是什么样子的?您需要发布1)编译2)复制错误的代码请检查您的操作方式实现的用户名或用户名引用的任何属性。如果可能,请在此处发布代码。需要用户名和电子邮件地址属性的代码,而不是创建者属性…从控制台创建此用户对我来说很好。这确实会引入SO例外。但是在属性设置器中,而不是在构造函数中的UserName=“”,如问题中所述。这确实引入了一个SO异常。但是在属性设置器中,而不是在构造函数中的UserName=“”,如问题中所述。我仍然认为这是一个代码问题。代码应该是防御性的,并且能够优雅地处理这样的数据问题。但是我不明白为什么会导致堆栈溢出。我能做到以下几点没问题<代码>用户=新用户();user.Creator=用户代码>@Richard我同意。我正在添加一些额外的检查,以便在这种情况下递归停止。我仍然认为这是一个代码问题。代码应该是防御性的,并且能够优雅地处理这样的数据问题。但是我不明白为什么会导致堆栈溢出。我能做到以下几点没问题<代码>用户=新用户();user.Creator=用户代码>@Richard我同意。我添加了一些额外的检查,以便在这种情况下递归停止。显然,他回答了自己的问题,说他在创建自己的创建者用户时正在进行一些循环。起初我想不出为什么这会是一个问题,因为user.Creator=user代码>不应该是一个问题,但现在我可以看到他创建了同一用户的另一个实例,将其设置为创建者,他一遍又一遍地这样做,而不是使用同一个用户对象。所以他的问题是他没有发布的代码。哈哈,我的猜测是对的,只是我猜他的Creator=newuser()
不在构造函数中,而是在他的数据循环中创建用户。我要把我的帖子更新到上海