2012-04-10 18 views
0

Stack Overflow. Nehmen wir an, ich möchte eine nicht statische Klasse von Variablen initialisieren, von denen zwei eine UserID (int) und MyDictionary (Dictionary) sind. Diese nicht statische Klasse wird in einer statischen Klasse deklariert (und in einem der Member der statischen Klasse initialisiert). Wenn das Skript lange ausgeführt wird und ein anderer Benutzer auf dieselbe Seite zugreift, besteht die Möglichkeit, dass der neue Benutzer den Inhalt des MyDictionary des anderen Benutzers ändert. Aber ich sehe nicht, wie dies möglich ist, da MyDictionary in einer nicht statischen Klasse ist. Versteht das jemand? Vielen Dank.ASP.NET nicht statische Klasse innerhalb einer statischen Klasse Thread-Sicherheit

+0

Woher kommst du, dass ein Benutzer serverseitige Sachen ändern könnte, die von jemand anderem benutzt werden? Server machen separate Threads und Speicher für jeden Benutzer, wenn ich mich nicht irre. Außerdem würde ich empfehlen, dass Sie alle Ihre Klassen in separaten Dateien ablegen, außer wenn Sie eine private Klasse haben, die nur in einer Klasse verwendet wird. – MarioDS

Antwort

1

Also ich nehme an, der Code sieht ein bisschen so aus, oder?

public class MyNonStaticClass 
{ 
    public int UserID; 

    public Dictionary<int, string> MyDictionary 
     = new Dictionary<int, string>; 
} 

public static class MyStaticClass 
{ 
    public static MyNonStaticClass aStaticInstanceOfTheNonStaticClass 
     = new MyNonStaticClass(); 

    public static void AddToDictionary(int key, string value) 
    { 
     aStaticInstanceOfTheNonStaticClass.add(key, value); 
    } 
} 

das Objekt innerhalb der statischen Klasse als statische Variable Durch die Deklaration Sie grundsätzlich sagen, sind „In meiner Anwendung möchte ich eine von ihnen, und nur einer von ihnen“; Auch wenn die Klasse nicht statisch ist; Sie erstellen immer noch eine statische Instanz davon.

+0

Mann, ich habe das ungefähr eine Stunde herausgefunden, und deine Antwort bestätigt es. Vielen Dank. – user1325179

0

Da die enthaltende Klasse und das zugreifende Member statisch sind, wird singulärer Speicherplatz verwendet. Sie müssen davon ausgehen, dass die Referenzen der statischen Klasse (in diesem Fall Locals, Felder oder Eigenschaften) ebenfalls statisch sind (selbst wenn es sich um eine Instanziierung einer nicht statischen Klasse handelt).

Warum ist die Klasse überhaupt statisch? Wenn Sie eine gemeinsam genutzte Logik verwenden, können Sie das Dictionary mit Bezug auf die statische Methode übergeben.

1

Static-ness (oder Fehlen davon) tut nicht beeinflussen Thread-Sicherheit. Statisch bedeutet einfach, dass ein Klassenelement (eine Eigenschaft, ein Feld, eine Methode oder ein Konstruktor) dem Typ und nicht mit einer bestimmten Instanz einer Klasse zugeordnet ist.

Ich kann statischen Code schreiben, der nicht threadsicher ist (wie der Code, den Sie in Ihrer Frage beschreiben) und ich kann toolsicheren Instanzcode schreiben und umgekehrt. Hier sind einige nicht Thread (sehr schlecht) Code, mehr oder weniger entlang der Linien von dem, was ich denke, Sie tun:

public static class MyFoo { 

    // Just because this is a static property doesn't 
    // mean the contained dictionary is thread safe! 
    public static Dictionary<String, String> MyDictionary { get; set; } 

    public static MyFoo() { 
     MyDictionary = new Dictionary<String, String>(); 
    } 
} 

Wenn Sie benutzerspezifische Informationen in ASP.NET speichern müssen, verwenden Sie die Sitzungsobjekt oder (für langlebigere Daten) eine Datenbank. Verlassen Sie sich nie auf eine statische Variable - was, wenn sich zwei Benutzer gleichzeitig auf der Site befinden?

Verwandte Themen