【问题标题】:Global variables in c#.netc#.net 中的全局变量
【发布时间】:2010-03-15 06:21:42
【问题描述】:

如何在 C# Web 应用程序中设置全局变量?

我想要做的是在页面(可能是母版页)上设置一个变量并从任何页面访问这个变量。

我既不想使用缓存也不想使用会话。

我认为我必须使用 global.asax。有什么帮助吗?

【问题讨论】:

  • 缓存/会话不起作用有什么特殊原因吗?从技术上讲,应用程序是一个会话/缓存对象,因此如果您正在使用它(以非静态方式),那么您已经在使用会话。如果它是特定于会话的部分,则可以使用应用级缓存来解决。
  • 是的,因为我需要存储一个大列表,而缓存只有 16MB,所以我不想浪费缓存资源...
  • 你想要一个单身人士吗?由处理 all 请求的 all 线程共享的单个对象?或者您只是想要一种在 MasterPage 和 ContentPage 之间共享数据的方式。如果是后者,那么全局变量肯定不是一个好的解决方案。
  • 我需要在项目中的所有页面之间共享全局变量。不仅在母版页和内容页之间。
  • 16MB?你有这方面的参考吗?我以前从未听说过这个限制。我知道我在某些服务器上使用了数 GB 范围内的操作缓存。

标签: c# .net global-variables


【解决方案1】:

使用公共静态类并从任何地方访问它。

public static class MyGlobals {
    public const string Prefix = "ID_"; // cannot change
    public static int Total = 5; // can change because not const
}

这样使用,从母版页或任何地方:

string strStuff = MyGlobals.Prefix + "something";
textBox1.Text = "total of " + MyGlobals.Total.ToString();

您不需要创建类的实例;事实上你不能,因为它是静态的。 new 直接用就行了。静态类中的所有成员也必须是静态的。字符串 Prefix 未标记为静态,因为 const 本质上是隐式静态的。

静态类可以在项目中的任何位置。它不必是 Global.asax 或任何特定页面的一部分,因为它是“全局的”(或者至少在面向对象的术语中我们可以接近该概念。)

您可以根据需要创建任意数量的静态类,并为它们命名。


有时程序员喜欢使用嵌套的静态类来对常量进行分组。例如,

public static class Globals {
    public static class DbProcedures {
        public const string Sp_Get_Addresses = "dbo.[Get_Addresses]";
        public const string Sp_Get_Names = "dbo.[Get_First_Names]";
    }
    public static class Commands {
        public const string Go = "go";
        public const string SubmitPage = "submit_now";
    }
}

并像这样访问它们:

MyDbCommand proc = new MyDbCommand( Globals.DbProcedures.Sp_Get_Addresses );
proc.Execute();
//or
string strCommand = Globals.Commands.Go;

【讨论】:

    【解决方案2】:

    我第二个 jdk 的回答:应用程序的任何类的任何公共静态成员都可以被视为“全局变量”。

    但是,请注意这是一个 ASP.NET 应用程序,因此,它是一个用于全局变量的多线程上下文。因此,当您更新和/或从这些变量读取数据时,您应该使用一些锁定机制。否则,您的数据可能会处于损坏状态。

    【讨论】:

    • 这只是全局变量的缺点吗?还是缓存?
    • AFAIK,ASP.NET 应用程序附带的 Cache 对象的公共方法是线程安全的。但是请查看文档...
    【解决方案3】:

    您可以在您的应用程序中创建一个继承自 System.Web.UI.Page 的基类。 让您的所有页面都继承自新创建的基类。使用预期的访问修饰符向基类添加属性或变量,以便从应用程序中的所有页面访问它。

    【讨论】:

      【解决方案4】:

      您可以使用application scope 创建一个变量

      【讨论】:

      • 此链接已失效。
      【解决方案5】:
      /// <summary>
      /// Contains global variables for project.
      /// </summary>
      public static class GlobalVar
      {
      /// <summary>
      /// Global variable that is constant.
      /// </summary>
      public const string GlobalString = "Important Text";
      
      /// <summary>
      /// Static value protected by access routine.
      /// </summary>
      static int _globalValue;
      
      /// <summary>
      /// Access routine for global variable.
      /// </summary>
      public static int GlobalValue
      {
      get
      {
          return _globalValue;
      }
      set
      {
          _globalValue = value;
      }
      }
      
      /// <summary>
      /// Global static field.
      /// </summary>
      public static bool GlobalBoolean;
      }
      

      【讨论】:

        【解决方案6】:

        只需在类的开头声明变量即可。

        例如对于字符串变量:

        public partial class Login : System.Web.UI.Page
        {
            public string sError;
        
            protected void Page_Load(object sender, EventArgs e)
            {
                 //Page Load Code
            }
        

        【讨论】:

          猜你喜欢
          • 2015-06-12
          • 1970-01-01
          • 2010-12-20
          • 2017-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多