如何防止这种循环

本文关键字:循环 何防止 | 更新日期: 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().Na​me + "_" + 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.G​etName().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的方式。也许只有初始化/检查,如果你正在写。毕竟,你更有可能经常阅读而不是写作。

希望对你有帮助。