Sperrt zuteilen
-
10-07-2019 - |
Frage
Ich habe irgendwo gelesen, obwohl ich kann mich nicht erinnern, wo, dass die Sperre Schlüsselwort in C # kann zuweisen.
Ich weiß, dass ein Valuetype zu sperren versuchen, die Valuetype-Box, aber gibt es andere Situationen?
EDIT ::
- scheint jeder zu sein, die Antwort Valuetype Fall, ich dies bereits wissen!
- Ich weiß auch, was Schlösser sind und wie sie in großer Tiefe zu verwenden, allgemeine Beratung über die beste Praxis ist nett - aber nutzlos;)
- Ich muss weiß, weil ich eine XNA App baute für den Einsatz auf der Xbox. die xbox Garbage Collector ist sehr langsam - dies bedeutet, ich brauche zu halten Zuweisungen auf ein Minimum, vorzugsweise inexistent (die die verhindert Sammler aus immer läuft)
Lösung
Während die Zuweisung von sehen intern Sync-Block ist faul (aber das ist eine Implementierung Detail, das IIRC ich von Essential.NET ‚Band 1‘ wissen, oder ist es über C # CLR - und soll als nur das behandelt werden), die einfache Fall des Artikels benötigen eingerahmt werden, wie Sie vorschlagen entstehen nicht - siehe Warum Sperre (
Andere Tipps
Wenn Sie mit dachten:
Schloss (das)
Sie sollten wissen, dass, weil Sie auf Ihre Instanz suchen, die Benutzer des Klasse könnte auch auf sie verriegeln und schrauben Sie oben. Unabhängig davon, ob das ist ein Frage hängt davon ab, was Sie denken, Ihre Benutzer tun könnte. Die gleiche Situation liegt vor, wenn Sie tun:
Schloss (typeof (MyClass))
Wenn Sie dies nicht tun, Sie können leicht eine statische oder Instanz zuweisen Objekt (dh Objekt myLock = new Object ()) und dann auf die sperren.
Was vs Werttyp auf Referenztyp Sperren , diese SO Frage auf eine Ressource sperren, wenn erhalten ... hat die Antwort:
Es hängt von der Art - wenn ein Referenzart dann ja, wenn ein Wert Typ-Nr. Dies ist auch, warum sollten Sie nie sperren, je auf einem Werttyp seit der Werttyp wird eingerahmt und jede nachfolgende Versuche zu erfassen, dass Wert erwerben tatsächlich eine Sperre auf ein anderes Objekt.
Definition von lock-Anweisung:
Sperre Statement (C # Referenz)
Das Schloss Schlüsselwort markiert eine Aussage Block als kritischer Abschnitt durch Erhalten des gegenseitigen Exklusionssperre für ein bestimmtes Objekt, eine Ausführung Anweisung, und dann die Freigabe des sperren.
Die SO Frage auf Schloss Schlüsselwort in C # in der Lage sein zu helfen. Sie können auch einen Blick auf Warum lock () ist nicht erlaubt, aber Monitor.Enter () erlaubt?
Die Spezifikation für den Compiler definiert die Verhalten die Sperre wie so :
Die Kompilierung Typ der Ausdruck einer lock-Anweisung wird werden, um ein Referenz-Typ oder ein> type Parameter (§25.1.1) bekannt sein, um ein Referenztyp. Es ist eine Kompilierung- Fehler für die Kompilierung Art der Ausdruck einen Wert-Typen zu bezeichnen.