这导致了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)
问题出在这一行:
albums = value;
Run Code Online (Sandbox Code Playgroud)
您递归地设置value将一次又一次调用setter 的属性,直到它stackoverflows.这行代码没有意义.摆脱它.
我想有一种错误的误解,即财产需要绑定到某个领域或其他东西.不是.一个属性本身只是几个不相关的方法,不需要彼此或字段有任何特定的关系.检索属性值时,只需调用其get方法并使用返回值,并在设置其值时,set使用适当的value参数调用其方法.您不需要以某种方式"更改"setter中的属性值.当您更改get要返回的值时会自动强制执行语义,因此下次调用get时,它将返回Session["..."]您已更改的值.
| 归档时间: |
|
| 查看次数: |
416 次 |
| 最近记录: |