如何防止这种循环
本文关键字:循环 何防止 | 更新日期: 2023-09-27 17:51:23
当我调用像
这样的函数时,我无法弄清楚如何修复这个循环问题new Common.Utility.Parameter().Get(Common.Constants.Parameter.SomeParameter);
可能是由于isHttpsCookie
调用了Parameter.Get()
Utility.cs
public static class Utility
{
public class Parameter
{
public string Get(string key)
{
string cookie = new Cookie().Read(key);
if (cookie == null)
{
var parameter = new Models.Parameter();
using (var db = new MyEntities())
parameter = db.Parameters.Where(w => w.Key == key).FirstOrDefault<Models.Parameter>();
if (parameter != null)
{
new Cookie().Write(key, parameter.Value);
return parameter.Value;
}
else
return string.Empty;
}
else
return cookie;
}
}
}
Cookie.cs
public class Cookie
{
private bool isHttpsCookie = Convert.ToBoolean(new Utility.Parameter().Get(Constants.Parameter.IsHttps)); // Loop here?
public string Read(string cookieName)
{
HttpCookie httpCookie = HttpContext.Current.Request.Cookies[HttpContext.Current.ApplicationInstance.GetType().BaseType.Assembly.GetName().Name + "_" + cookieName];
return httpCookie != null ? HttpContext.Current.Server.HtmlEncode(httpCookie.Value).Trim() : string.Empty;
}
public void Write(string cookieName, string cookieValue, bool isHttpCookie = true)
{
if (isHttpsCookie)
isHttpCookie = false;
var aCookie = new HttpCookie(HttpContext.Current.ApplicationInstance.GetType().BaseType.Assembly.GetName().Name + "_" + cookieName)
{Value = cookieValue, Expires = Common.Constants.Cookie.DefaultExpires, HttpOnly = isHttpCookie};
HttpContext.Current.Response.Cookies.Add(aCookie);
}
}
显然,您的代码在您怀疑的地方陷入了某种递归。我遇到的问题是,为什么你创建新对象只是为了调用一个方法。看起来你可以在你的类中把它们作为静态方法,所以不需要创建对象,因此不需要'循环'。
仔细看看你的Cookie.Write()和Parameter.Get()方法,它们是相互调用的。申报isHttpsCookie
时,调用Parameter.Get()
。在Parameter.Get()
中,如果条件有效,它将调用Cookie.Write()
。反过来,当你调用new Cookie()
时,isHttpsCookie
会被再次调用,并且它会永远持续下去。
代码中的另一个点:
if (isHttpsCookie)
isHttpCookie = false;
你想说isHttpsCookie应该一直是假的吗?那么为什么要声明这个呢?
解决方案:就像@Takeshi说的那样:这些方法可以声明为静态的,所以调用它们时不需要声明类
你的怀疑是正确的。这个isHttpsCookie声明让你很伤心。
当Cookie对象被创建时,它离开并执行从实用程序类中创建Cookie实例的方法get。因此你有了你的递归。
你需要改变初始化isHttpsCookie的方式。也许只有初始化/检查,如果你正在写。毕竟,你更有可能经常阅读而不是写作。
希望对你有帮助。