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

4

我在我的应用程序中使用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;
        }
    }

}

这是在整个项目中使用变量的正确方式吗?这种方法可能存在哪些优缺点?对于使用全局变量,你们会采取什么方法?

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;

@HackedByChinese 感谢您的建议,我的方法和您建议的简化代码的方法有什么区别呢?谢谢。 - Priyank Patel
自动实现属性会自动生成后备字段,因此您不必在源代码中包含它们。 - moribvndvs
2
一个简单的 Lazy 不就足够了吗? - L.B
1
Settings.Current = new Settings{ ImportantData = "blah blah blah"}; 会导致编译错误,因为"set"是不可访问的。 - Daniel Marín
1
这里是示例代码(fiddle)链接:https://dotnetfiddle.net/MUTZDp,它展示了我之前的评论。 - Daniel Marín

2
除了那两个陈词滥调“全局变量不好”和“属性好”,你的方法本质上没有什么问题。加油吧!在我看来,PSM。

好的,感谢你的建议。我可以问一下IMHO PSM是什么吗?可能听起来有点傻。谢谢。 - Priyank Patel
"PSM" 是我的名字 :). "IMHO" 意思是 "In My Humble Opinion"。而且,我真的没有注意到你已经在使用属性了:我以为你只有一堆公共静态变量。在我看来,这也完全可以。 - paulsm4

1
你没看到实例化类对象后看不到变量的原因是因为这些变量被声明为静态的。静态变量应该使用 ClassName.variableName 或 ClassName.PropertyName 的方式使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接