在ASP.NET中使用C#全局变量的正确方法?

时间:2012-06-09 05:57:32

标签: c# asp.net webforms global-variables

我在我的应用程序中使用ASP.NET Web Forms和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;
        }
    }

}

这是在整个项目中使用变量的正确方法吗?这种方法有什么可能的优缺点,你们采用什么方法来使用全局变量?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

在两个bromides之外的“全局变量都很糟糕”而“properties很好”......你的方法没有任何本质上的错误。去吧!

恕我直言.. PSM