静态类对象引用未设置为对象的实例

时间:2012-06-10 18:39:46

标签: c# asp.net static-classes

我有下一个静态类:

public static class GlobalVar
{
    public static string DatabaseName = "ProjectDatabase.mdf";

    public static AdminClass Admin;

    public static string TruePath = AppDomain.CurrentDomain.BaseDirectory;

    public static string TimeStampPattern = "dd/MM/yyyy HH:mm";

    static GlobalVar()
    {
        TruePath = TruePath.Remove(TruePath.Length - 1);
        Admin = new AdminClass("Admin", "Admin");
        GlobalStatus = new Dictionary<string, string>();
        string Query = "SELECT * FROM global_status";
        DataTable Types = MyAdoHelper.ExecuteDataTable(GlobalVar.DatabaseName, Query);
        foreach (DataRow Status in Types.Rows)
        {
            GlobalStatus.Add(Status["title"].ToString(), Status["info"].ToString());
        }
    }

    public static Dictionary<string, string> GlobalStatus; 

    public static string BasePath = HttpContext.Current.Request.ApplicationPath;
}

GlobalStatus是一个字典,可以收到网站可能返回的自定义错误。当我启动项目(Microsoft Visual Web developer 2008)时,它会出错:

Object reference not set to an instance of an object.

尝试从GlobalStatus获取值时(例如GlobalVar.GlobalStatus [“Page_NoAccess”])。

只有一分钟后,当我再次启动项目时,它运行良好。

如何解决此问题,例如强制浏览器等待它填满GlobalStatus。我需要这个类只初始化一次,因为它包含全局变量,我不想在每次浏览器请求时调用它。

由于

1 个答案:

答案 0 :(得分:2)

首先,我想建议你在面向对象的代码中使用全局变量概念是一个坏主意。

为了解决您的问题,您需要使用内置的,开箱即用的ASP.NET approaches: global application class.

在此事件期间使用Application_Start事件处理程序并调用初始化过程。

任何与上述陈述相反的观点都是一个坏主意。

现在......如何做得更好

  1. 您找到的所有设置为use AppSettingssettings files
  2. 使用静态构造函数进行应用程序初始化是个坏主意。 使用Initialize()Start() ... 等静态方法创建静态类。在全局应用程序类的Application_Start事件中调用它们。
  3. 在ASP.NET等多线程环境中使用静态字段和数据的静态类是一个很大的失败。不止一个线程可以立即初始化您的应用程序。 您的代码如何管理这种情况?
  4. 在面向对象的软件中忘记全局变量概念。使用设置(就像我在第1点中所说的那样)或创建常量或字段(静态或实例)作为将要使用它的类的一部分。
  5. 更新&amp;注意 我建议这个MSDN article关于静态构造函数,以便理解为什么这些在ASP.NET初始化中是个坏主意。