如何防止这种循环?

时间:2015-06-01 23:13:36

标签: c# loops

当我调用像

这样的函数时,我无法弄清楚如何解决这个循环问题
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);
    }
}

3 个答案:

答案 0 :(得分:1)

显然,您的代码会陷入一种您怀疑它的递归。我遇到的问题是为什么要创建新对象只是为了调用单个方法。看起来您可以将它们作为类中的静态方法,因此不需要创建对象,因此不会循环播放。

答案 1 :(得分:1)

仔细看看你的Cookie.Write()和Parameter.Get()方法,它们互相调用。当您声明isHttpsCookie时,请致电Parameter.Get()。在Parameter.Get()中,如果条件有效,则会调用Cookie.Write()。反过来,当您致电new Cookie()时,会再次调用isHttpsCookie并且它会一直持续。

此代码的另一点:

if (isHttpsCookie)
        isHttpCookie = false;

你试着说isHttpsCookie应该一直都是假的吗?那你为什么要宣布这个呢?

解决方案:喜欢@Takeshi说:这些方法可以声明为静态,因此不需要类声明来调用它们。

答案 2 :(得分:0)

你怀疑的是正确的。 isHttpsCookie声明让你感到悲伤。

当创建Cookie对象时,它会消失,并从您的实用程序类执行方法get,这将创建一个cookie实例。因此,你有你的递归。

您需要更改初始化isHttpsCookie的方式。也许只是初始化/检查你是否正在写。毕竟你很可能会比写作更频繁地阅读。

希望有所帮助。