[英]StackOverflow Exception
mscorlib.dll中发生类型为'System.StackOverflowException'的未处理异常
在page_load事件中,我正在打电话
if (mySession.Current._isCustomer)
{
Response.Redirect("Products.aspx");
}
mySession类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ShoppingCartWebApp
{
public class mySession
{
// private constructor
private mySession() {}
// Gets the current session.
public static mySession Current
{
get
{
mySession session =
(mySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new mySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string _Property1 { get; set; }
public DateTime _date { get; set; }
public String _loginId { get; set; }
public string _firstName { get; set; }
public string _userName { get; set; }
public string _role { get; set; }
public Boolean _isCustomer = false;
public Boolean _isAuth = false;
public Boolean _isGuest = true;
public ShoppingCart _cart = new ShoppingCart();
public ShoppingCart instance
{
get
{
return _cart;
}
set
{
_cart = value;
}
}
public void abandonSession()
{
// _date =
_loginId = null;
_firstName = null;
_cart = null;
_userName = null;
_role = null;
_isCustomer = false;
_isAuth = false;
}
}
}
它给出了stackoverflow异常。 为什么?
ShoppingCart类别:
public class ShoppingCart
{
#region ListCart
public List<CartItem> Items { get; private set; }
public static SqlConnection conn = new SqlConnection(connStr.connString);
#endregion
#region CartSession
public ShoppingCart cart;
public ShoppingCart()
{
if (mySession.Current._cart == null)
{
cart = new ShoppingCart();
cart.Items = new List<CartItem>();
if (mySession.Current._isCustomer)
cart.Items = ShoppingCart.loadCart(mySession.Current._loginId);
mySession.Current._cart = cart;
}
else
{
cart = mySession.Current._cart;
}
}
}
这行代码会导致无限循环和堆栈溢出:
if (mySession.Current._isCustomer)
cart.Items = ShoppingCart.loadCart(mySession.Current._loginId);
它由mysession类的每个实例初始化。 并使用其父类。
即使使用单例mySession也无法解决问题。
当此代码执行时:
session = new mySession();
它尝试初始化新的ShoppingCard 。 购物卡要求mysession的单例实例。 这行代码尚未执行:
HttpContext.Current.Session["__MySession__"] = session;
所以去创建我的会话的新实例,并...
这意味着堆栈溢出!
您可以这样纠正:
public static mySession Current
{
get
{
mySession session =
(mySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new mySession();
HttpContext.Current.Session["__MySession__"] = session;
session._cart = new ShoppingCart(); //initialize your shoppoing car after adding variable to session !
}
return session;
}
}
public ShoppingCart _cart;// = new ShoppingCart(); remove initialization
看看我在代码中的注释。
问题是由于mySession
和ShoppingCart
之间的关系引起的。
mySession
的成员变量定义如下:
public ShoppingCart _cart = new ShoppingCart();
调用mySession
的构造方法时,将实例化ShoppingCart
的实例。 ShoppingCart
的构造函数执行时,将调用mySession.Current
静态属性。 因为ShoppingCart
的构造函数是从同一属性中调用的(请记住,我们仍在原始静态调用中创建mySession
的实例),所以它将继续以这种方式递归,直到引发StackOverflowException
。
要解决此问题,建议您看一下ShoppingCart
类。 首先,为什么它需要一个自身实例作为成员变量? 其次,如果ShoppingCart
需要了解有关mySession
内容的信息,则您的封装不正确。 我建议您将所需的信息传递给ShoppingCart
的构造函数,以避免调用mySession.Current
。
考虑到您更新的问题,我认为如果您正确地遵循.Net命名准则(如我对问题的评论中所述),则您应该能够轻松找出问题所在。 我怀疑您的调用代码是相似的,并且没有遵循准则会使实际发生的事情与您认为发生的事情相混淆。
第一步,我建议进行此清理。 这很可能会弄清楚造成溢出的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.