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
Antwort
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.
Mann, ich habe das ungefähr eine Stunde herausgefunden, und deine Antwort bestätigt es. Vielen Dank. – user1325179
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.
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?
- 1. Wie nicht-statische Kind Klasse der statischen Klasse serialisiert
- 2. Serialisieren einer statischen Klasse?
- 3. Powershell Verwenden von statischer Klasse innerhalb einer statischen Klasse zuzugreifen
- 4. wie Linq2SQL Klasse aus einer statischen Klasse
- 5. Statische Liste innerhalb einer generischen Klasse
- 6. ES6 - Aufruf statische Methode innerhalb einer Klasse
- 7. Warum liegt eine Klasse innerhalb einer Klasse nicht im Bereich einer anderen Klasse innerhalb einer Klasse?
- 8. Bereich der statischen inneren Klasse in ASP.NET
- 9. Kann statische statische Klasse nicht 'importieren'?
- 10. Testen einer Klasse mit einer statischen Klasse/Methode Abhängigkeit
- 11. Klon der statischen Klasse
- 12. nicht-statische Klasse kann nicht von einem statischen Kontext
- 13. Java-Klasse innerhalb einer Klasse
- 14. Get Label in einer statischen Methode innerhalb der Klasse C#
- 15. Statische Mitglieder einer Klasse
- 16. Repository als statische oder nicht statische Klasse?
- 17. Statische verschachtelte Klasse nicht drucken
- 18. Statische innere Klasse nicht statische Felder Echtzeit-Dienstprogramm und Codesyntax
- 19. Verschachtelte statische Klasse kann ihre statischen Felder nicht zurückgeben
- 20. Zweck der statischen Objekte innerhalb der Klasse
- 21. Klasse Reflexion von einer statischen Methode
- 22. PHP-Klasse statische und nicht statische
- 23. Schreiben eines Cookies aus einer statischen Klasse
- 24. Wann Singleton-Klasse über statische Klasse
- 25. Was ist der Umfang einer statischen Klasse?
- 26. Android statische Klasse vs nicht-statische Klasse Speicher Leistung
- 27. C# Globale Instanz einer statischen Klasse erstellen
- 28. Aufrufe nicht statische Methoden einer Klasse
- 29. Statische Memberinitialisierungsliste in einer Klasse Vorlage
- 30. erben eine statische Klasse
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