2010-03-15 6 views
40

Как установить глобальную переменную в веб-приложении C#?Глобальные переменные в C# .net

Что я хочу сделать, это установить переменную на странице (возможно, главная страница) и получить доступ к этой переменной с любой страницы.

Я хочу использовать ни кеш, ни сеансы.

Я думаю, что мне нужно использовать global.asax. Любая помощь?

+0

Есть ли какой-либо кэш причина/сессия не будет работать?Технически приложение является объектом Session/Cache, поэтому, если вы используете это (нестатически), вы уже используете Session. Если это определенная часть сеанса, которую можно решить с кешем уровня приложения. – GrayWizardx

+0

да, потому что мне нужно хранить большой список, а кеш - только 16 МБ, поэтому я не хочу тратить деньги на ресурсы ... – scatman

+0

Вы хотите синглтон? Единственный объект, который разделяет * все * потоки, обрабатывающие * все * запросы? Или вам просто нужен способ обмена данными между MasterPage и ContentPage. Если это более поздние, то глобальные переменные, безусловно, не являются хорошим решением. – tarn

ответ

95

Использовать открытый статический класс и получить доступ к нему из любого места.

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 Просто используйте его напрямую. Все члены внутри статического класса также должны быть статическими. Строка Префикс не помечен как статический, поскольку 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

+1 для элегантного решения - приятно, мне это нравится. – SoftwareGeek

4

Я ответ второго JDK в: любой публичный статический член любого класса приложения можно рассматривать в качестве «глобальной переменной».

Однако обратите внимание на то, что это приложение ASP.NET, и оно представляет собой многопотоковый контекст для глобальных переменных. Поэтому вам следует использовать механизм блокировки при обновлении и/или чтении данных в/из этих переменных. В противном случае вы можете получить свои данные в поврежденном состоянии.

+0

является ли это недостатком только для глобальных переменных? или для кеша? – scatman

+0

AFAIK, общедоступные методы объекта Cache, который поставляется с приложением ASP.NET, являются потокобезопасными. Но взгляните на документацию ... –

3

Вы можете создать базовый класс в приложении, который наследуется от System.Web.UI.Page. Пусть все ваши страницы наследуются от только что созданного базового класса. Добавьте свойство или переменную в ваш базовый класс с предполагаемым модификатором доступа, чтобы он был доступен со всех ваших страниц в приложении.

-3

Просто объявите переменную в начале класса.

например. для строки переменной:

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

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Page Load Code 
    } 
0
/// <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; 
} 
Смежные вопросы