为什么会导致StackOverFlow错误?

Xai*_*oft 0 .net c#

这导致了StackOverFlow错误,我知道为什么,但我想了解更多详细信息为什么,并且是我应该处理它的解决方案.好的,首先,当我尝试为属性赋值时,以下代码会导致StackOverFlow错误:

private List<Albums> albums
{
    get
    {
        if (Session["albums"] != null)
            return (List<Albums>)Session["albums"];
        else
            return AlbumCollection.GetAlbums();
    }
    set
    {
    albums = value;
    Session["albums"] = albums;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了解决上述问题,我更改了属性的名称并添加了另一个变量来保存解决StackOverFlow问题的属性值:

private List<Albums> albums = null;
private List<Albums> Albums
{
    get
    {
        if (Session["albums"] != null)
            return (List<Albums>)Session["albums"];
        else
            return AlbumCollection.GetAlbums();
    }
    set
    {
    albums = value;
    Session["albums"] = albums;
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,我正在设置setter,分配值,然后分配Session ["albums"]相册中的值吗?我可以做完,会话["专辑"] =价值吗?

Cha*_*ana 16

因为在你的setter中,你正在调用... setter,它进入setter,然后调用... setter ......和...

 set
 {    
    albums = value;       // < --- This line calls itself again.. 
    Session["albums"] = albums;
 }
Run Code Online (Sandbox Code Playgroud)

您需要做的只是使用Session ["albums"]作为值的持久存储...您不需要私有字段 - 这只是创建值的冗余副本.完全消除它,然后放......

private List<Albums> Albums
{    
    get    
    {        
         if (Session["albums"] != null)
              return (List<Albums>) Session["albums"];        
         else            
            return (Session["albums"] = AlbumCollection.GetAlbums());    
    }    
    set    
    {    
        Session["albums"] = value;    
    }
}
Run Code Online (Sandbox Code Playgroud)

在某些您没有持久存储的情况下,公共属性只有一个私有成员支持字段是完全可以接受的.

有关C#属性的更多信息,请查看MSDN教程.


Adr*_*der 11

你正在重新分配房产本身.

在您的情况下,您只使用会话.

所以这应该没问题

private List<Albums> albums
{
    get
    {
        if (Session["albums"] == null)
            Session["albums"] = AlbumCollection.GetAlbums();
        return (List<Albums>)Session["albums"];
    }
    set
    {
        Session["albums"] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 5

问题出在这一行:

albums = value;
Run Code Online (Sandbox Code Playgroud)

您递归地设置value将一次又一次调用setter 的属性,直到它stackoverflows.这行代码没有意义.摆脱它.

我想有一种错误的误解,即财产需要绑定到某个领域或其他东西.不是.一个属性本身只是几个不相关的方法,不需要彼此或字段有任何特定的关系.检索属性值时,只需调用其get方法并使用返回值,并在设置其值时,set使用适当的value参数调用其方法.您不需要以某种方式"更改"setter中的属性值.当您更改get要返回的值时会自动强制执行语义,因此下次调用get时,它将返回Session["..."]您已更改的值.