0

次の静的クラスがあります:

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"])。

1分後、プロジェクトを再度起動すると、正常に実行されます。

GlobalStatusがいっぱいになるまでブラウザを強制的に待機させるなど、これを修正するにはどうすればよいですか。このクラスには、ブラウザのリクエストごとに呼び出されたくないグローバル変数が含まれているため、このクラスを1回だけ初期化する必要があります。

ありがとう

4

1 に答える 1

2

まず第一に、オブジェクト指向コードでのグローバル変数の概念は悪い考えであることを提案したいと思います。

問題を解決するには、組み込みの、すぐに使用できるASP.NETアプローチであるグローバルアプリケーションクラスを使用する必要があります。

Application_Startイベントハンドラーを使用して、このイベント中に初期化プロセスを呼び出します。

上記のステートメントに反対するものはすべて悪い考えです。

今...それをより良くする方法

  1. 設定であることがわかったものはすべて、AppSettingsまたは設定ファイル使用してください。
  2. アプリケーションの初期化に静的コンストラクターを使用することはお勧めできません。...などの静的メソッドを使用して静的クラスを作成しますInitialize()Start()Application_Startグローバルアプリケーションクラスの場合はそれらを呼び出します。
  3. ASP.NETのようなマルチスレッド環境での静的フィールドとデータを持つ静的クラスは大きな失敗です。複数のスレッドでアプリケーションを一度に初期化できます。コードはこの状況をどのように管理しますか?
  4. オブジェクト指向のソフトウェアでグローバル変数の概念を忘れてください。設定を使用するか(最初のポイントで述べたように)、それを消費するクラスの一部として定数またはフィールド(静的またはインスタンスのもの)を作成します。

更新と注記静的コンストラクターに関する このMSDNの記事をお勧めします。これは、静的コンストラクターがASP.NETの初期化で不適切な理由である理由を理解するためです。

于 2012-06-10T19:11:01.693 に答える