c#静态成员问题

本文关键字:成员问题 静态 | 更新日期: 2023-09-27 18:08:05

例如,我有如下静态类:

public static class f
{
    public static bool IS_GUEST = (HttpContext.Current.Session["uid"] == null);
    public static bool IS_ADMIN = (HttpContext.Current.Session["admin"] != null);
    //...

现在,如果我使用IS_GUEST检查用户是否为Guest,即使用户不是Guest(会话"uid"确实存在),我也总是得到true。对于IS_ADMIN,无论如何,我总是得到false。会话是在我调用IS_GUEST和IS_ADMIN之前创建的,如果我手动检查它(HttpContext.Currest.Session[something]),它工作得很好。那么问题是什么呢?

c#静态成员问题

静态初始化器在代码中的任何方法之前运行。所以很可能HttpContext.Current.Session在初始化字段时还没有初始化。将它们更改为属性,一切都应该按预期工作。

  public static class f
  {
     public static bool IS_GUEST
     {
        get
        {
           return (HttpContext.Current.Session["uid"] == null);
        }
     }
     public static bool IS_ADMIN
     {
        get
        {
           return (HttpContext.Current.Session["admin"] != null);
        }
     }

您必须在来宾/管理员登录时设置这些值。

除了DeCaf所说的,静态字段在应用程序域中的所有线程之间共享。

在该应用程序域中运行的所有请求将在给定时间点共享相同的值。

将会话中的静态变量值存储在静态变量中不是一个好主意。首先,session中的值可以改变,但是静态变量不会改变。

可能你正在找这个:

public static class f
{
    public static bool IsGuest 
    {
        get
        {
            return HttpContext.Current.Session["uid"] == null;
        }
    }
    public static bool IsAdmin
    {
        get
        {
            return HttpContext.Current.Session["admin"] != null;
        }
    }
    //...
}

在这种情况下,您可以访问静态变量,如F.IsGuest,您将获得最新的信息。