2010-03-15 23 views
40

Wie kann ich eine globale Variable in einer C# -Webanwendung festlegen?Globale Variablen in C# .net

Was ich tun möchte, ist eine Variable auf einer Seite (Master-Seite vielleicht) und Zugriff auf diese Variable von jeder Seite.

Ich möchte weder Cache noch Sitzungen verwenden.

Ich denke, dass ich global.asax verwenden muss. Irgendeine Hilfe?

+0

Gibt es einen bestimmten Grund cache/Sitzung nicht funktionieren?Technisch gesehen ist die Anwendung ein Session/Cache-Objekt, und wenn Sie dies (auf nicht statische Weise) verwenden, verwenden Sie bereits Sessions. Wenn es sich um den sitzungsspezifischen Teil handelt, kann dieser mit dem Cache auf App-Ebene angesprochen werden. – GrayWizardx

+0

ja, weil ich eine große Liste speichern muss, und der Cache ist nur 16 MB, also will ich nicht cahe Ressourcen verschwenden ... – scatman

+0

Wollen Sie ein Singleton? Ein einzelnes Objekt, das von * allen * Threads verwendet wird, die * alle * Anfragen bearbeiten? Oder möchten Sie nur eine Möglichkeit, Daten zwischen einer MasterPage und einer ContentPage freizugeben? Wenn es später ist, dann sind globale Variablen sicherlich keine gute Lösung. – tarn

Antwort

95

Verwenden Sie eine öffentliche statische Klasse und greifen Sie von überall darauf zu.

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

wie so verwendet wird, von der Master-Seite oder überall:

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

Sie müssen keine Instanz der Klasse zu machen; in der Tat können Sie nicht, weil es statisch ist. new Verwenden Sie es einfach direkt. Alle Mitglieder innerhalb einer statischen Klasse müssen ebenfalls statisch sein. Die Zeichenfolge Präfix ist nicht als statisch markiert, da const von Natur aus implizit statisch ist.

Die statische Klasse kann in Ihrem Projekt beliebig sein. Es muss nicht Teil von Global.asax oder einer bestimmten Seite sein, weil es "global" ist (oder mindestens so nah wie möglich an dieses Konzept in objektorientierten Begriffen.)

Sie können so viele machen statische Klassen, wie Sie möchten und nennen Sie sie, was Sie wollen.


Manchmal möchten Programmierer ihre Konstanten gruppieren, indem sie verschachtelte statische Klassen verwenden. Zum Beispiel

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"; 
    } 
} 

und greifen Sie wie folgt:

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

+1 für eine elegante Lösung- schön, ich mag es. – SoftwareGeek

4

I zweite jdk Antwort: jede öffentliche statische Mitglied einer Klasse Ihrer Anwendung kann als „globale Variable“ betrachtet werden.

Beachten Sie jedoch, dass dies eine ASP.NET-Anwendung ist, und als solche ist es ein multi-threaded Kontext für Ihre globalen Variablen. Daher sollten Sie einen Sperrmechanismus verwenden, wenn Sie die Daten zu/von diesen Variablen aktualisieren und/oder lesen. Andernfalls könnten Sie Ihre Daten in einem beschädigten Zustand erhalten.

+0

ist das ein Nachteil nur für globale Variablen? oder für den Cache auch? – scatman

+0

AFAIK, die öffentlichen Methoden des Cache-Objekts, das mit einer ASP.NET-Anwendung geliefert wird, sind threadsicher. Aber werfen Sie einen Blick auf die Dokumentation ... –

3

erstellen Sie können eine Basisklasse in Ihrer Anwendung erstellen, die von System.Web.UI.Page erbt. Lassen Sie alle Ihre Seiten von der neu erstellten Basisklasse erben. Fügen Sie Ihrer Basisklasse mit dem Propected Access Modifier eine Eigenschaft oder eine Variable hinzu, damit auf alle Ihre Seiten in der Anwendung zugegriffen wird.

-3

Deklarieren Sie einfach die Variable am Anfang einer Klasse.

z.B. für String-Variable:

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