C#.net中的全局变量

49

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

我的需求是在某个页面(也许是主页面)上设置一个变量,并从任何页面访问该变量。

我不想使用缓存或会话。

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


有没有特定的原因缓存/会话不起作用?从技术上讲,应用程序是一个会话/缓存对象,因此如果您正在以非静态方式使用它(即动态方式),则已经在使用会话。如果是会话特定部分出了问题,可以通过应用程序级别的缓存来解决。 - GrayWizardx
是的,因为我需要存储一个大列表,而缓存仅有16MB,所以我不想浪费缓存资源。 - scatman
你想要一个单例吗?一个被所有线程处理所有请求共享的对象?还是你只是想要一种在MasterPage和ContentPage之间共享数据的方式。如果是后者,那么全局变量肯定不是一个好的解决方案。 - tarn
我需要在我的项目中所有页面之间共享全局变量,而不仅仅是主页和内容页之间。 - scatman
16MB?你有参考资料吗?我以前从未听说过这个限制。我知道我在某些服务器上使用了多GB级别的操作缓存。 - GrayWizardx
6个回答

117

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

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();
您不需要创建该类的实例,因为它是静态的。事实上,您无法创建该实例。只需直接使用它即可。静态类中的所有成员也必须是静态的。字符串“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;

6

我赞同jdk的回答:你应该把应用程序中任何一个类的公共静态成员视为“全局变量”。

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


这只是针对全局变量的缺点吗?还是也适用于缓存? - scatman
据我所知,随着ASP.NET应用程序提供的Cache对象的公共方法是线程安全的。但请查看文档... - Ron Klein

4

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


0

1
这个链接已经失效了。 - Sam White

-1
/// <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;
}

-4

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

例如,对于字符串变量:

public partial class Login : System.Web.UI.Page
{
    public string sError;

    protected void Page_Load(object sender, EventArgs e)
    {
         //Page Load Code
    }

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