asp.net c#类属性stackerflow异常

本文关键字:stackerflow 异常 属性 net asp | 更新日期: 2023-09-27 18:09:04

我有一个非常简单的C#类:

namespace mybox
{
    public class userAccount : IMyInterface
    {
        public userAccount()
        {
        }
        private int _userId;
        private string _userName;
        public int userId
        {
            get { return _userId; }
            set { userId = value; }
        }
        public string userName
        {
            get { return _userName; }
            set { userName = value; }
        }
        public string list(int myUserId)
        {
            ...
           myOutPut = string.Format("{0} {1} {2}", u.userId, u.userName);
           return myOutPut.ToString();
        }
    public void add()
    {
           pillboxDataContext db = new pillboxDataContext();
           userAccount newUser = new userAccount();
           newUser.userName = "test123";
           db.SubmitChanges();
       }
    }
}

在Page_Load事件中的default.aspx中,我试图调用list方法:

protected void Page_Load(object sender, EventArgs e)
{
    pillbox.userAccount myUA = new pillbox.userAccount();
    myUA.add();

//控制台。WriteLine(myUA.list(1((;

}

当我调用add方法时,我可以看到它试图将值test123分配给属性,但我得到了以下消息:

类型为"System"的未处理异常。应用程序代码1zm0trtk.dll中出现StackOverflowException

你知道我做错了什么吗?

asp.net c#类属性stackerflow异常

问题在于您定义属性的方式。

您正试图引用在setter中为其赋值的属性这导致中篇递归(具体地说,这一行触发它newUser.userName = "test123";(。

将其更改为:

public int userId         
{             
    get { return _userId; }             
    set { _userId = value; }         
}         
public string userName         
{             
        get { return _userName; }             
        set { _userName = value; }         
} 

这是因为userName调用自己。您可能打算分配字段:

这行错了:

set { userName = value; }

你想写:

set { _userName = value; }

您需要设置私有后台字段,而不是属性。否则,当您一直在自己身上调用set时,您只会进入无限递归。

    private int _userId;
    private string _userName;
    public int userId
    {
        get { return _userId; }
        set { _userId = value; }
    }
    public string userName
    {
        get { return _userName; }
        set { _userName = value; }
    }

在您的情况下,您可以只使用自动实现的属性(我更改了大小写以匹配指南(:

public int UserId { get; set; }
public string UserName { get; set; }

如果您稍微重写一下setter,就很容易看到发生了什么。属性上的getset实际上被编译为方法(PropType get_PropName()void set_PropName(PropType value)(,对该属性的任何引用都被编译为对适当方法的调用。所以这个代码:

int i = myObj.MyIntProp;
myObj.MyIntProp = 6;

编译为

int i = myObj.get_MyIntProp();
myObj.set_MyIntProp(6);

所以你的设置

set
{
    username = value;
}

实际编译为

public void set_username(string value)
{
    set_username(value);
}

现在堆栈溢出的原因是显而易见的。