4

アプリケーションで ASP.NET Web フォームと C# を使用しています。という名前のクラス ファイルがあり、プロパティGlobal.csを使用して変数を定義します。そのクラス オブジェクトをインスタンス化することで、任意のページのどこでもこれらの変数を使用します。setget

これが私のGlobal.csファイルです:

using System;
using System.Data;
using System.Linq;
using System.Web;

/// <summary>
/// Contains my site's global variables.
/// </summary>
public static class Global
{
    /// <summary>
    /// Global variable storing important stuff.
    /// </summary>
    public static string gDate;
    public static string gMobLength;
    public static string gDateFormat;
    public static string gApplicationNo;
    public static string gBranchNo;
    public static string gMemId;
    public static string gIsEditable="false";
    public static string gLoggedInUserName;


    public static string ImportantData
    {
        get
        {
            return gDate;

        }
        set
        {
            gDate = value;

        }

    }
    public static string MobileLength
    {
        get
        {
            return gMobLength;
        }
        set
        {
            gMobLength = value;
        }
    }

    public static string DateFormat
    {
        get
        {
            return gDateFormat; 
        }
        set
        {
            gDateFormat = value; 
        }
    }
    public static string ApplicationNo
    {
        get
        {
            return gApplicationNo;
        }
        set
        {
            gApplicationNo = value; 
        }
    }
    public static string BranchNo
    {
        get
        {
            return gBranchNo; 
        }
        set
        {
            gBranchNo = value;
        }
    }

}

これは、プロジェクト全体で変数を使用する適切な方法ですか? このアプローチの長所と短所は何ですか?また、グローバル変数を使用するためにどのようなアプローチをとりますか?

4

3 に答える 3

4

まず、自動実装されたプロパティを使用することをお勧めします。

public static string BranchNo { get; set; }

コードを少し簡素化します。これが良いアプローチであるかどうかに関しては、状況によって異なります。シンプルでわかりやすい方が良い場合もあり、これはそのカテゴリに分類されます。初期化後に値を変更しない場合は、初期化で適切なシングルトンを使用することをお勧めします。

public class Settings
{
   private static Settings _current;
   private static readonly object _lock = new object();

   public static Settings Current
   {
      get
      {
         lock(_lock)
         {
            if (_current == null) throw new InvalidOperationException("Settings uninitialized");
            return _current;
         }
      }
      set
      {
          if (value == null) throw new ArgumentNullException();
          if (_current != null) throw new InvalidOperationException("Current settings can only be set once.");

          if (_current == null)
          {
              lock(_lock)
              {
                 if (_current == null) _current = value;
              }
          }
      }
   }


   public string ImportantData { get; private set; }

   // etc. 
}

設定の初期化:

Settings.Current = new Settings{ ImportantData = "blah blah blah"};

アクセス:

var data = Settings.Current.ImportantData;
于 2012-06-09T06:04:34.197 に答える
2

「グローバルは悪い」と「プロパティは良い」という2つのブロマイドの外では...あなたのアプローチに本質的に問題はありません。頑張れ!

私見..PSM

于 2012-06-09T06:03:05.150 に答える
1

そのクラス オブジェクトをインスタンス化した後に変数が表示されない理由は、変数が静的として宣言されているためです。静的変数は、そのマナー ClassName.variableName または ClassName.PropertyName によって使用されることを意図しています

于 2012-06-09T09:08:37.017 に答える