Eine relativ kleine Frage, aber ich konnte keine offizielle Dokumentation oder auch keine Blog-Meinung / -Diskussion dazu finden.
Einfach ausgedrückt: Wenn ich ein privates Objekt habe, dessen einziger Zweck darin besteht, für das Private zu dienen lock, wie bezeichne ich dieses Objekt?
class MyClass
{
private object LockingObject = new object();
void DoSomething()
{
lock(LockingObject)
{
//do something
}
}
}
Was sollen wir LockingObjecthier nennen? Berücksichtigen Sie auch nicht nur den Namen der Variablen, sondern auch, wie sie beim Sperren im Code aussieht.
Ich habe verschiedene Beispiele gesehen, aber anscheinend keinen soliden Ratschlag:
Viele Verwendungen von
SyncRoot(und Variationen wie_syncRoot).- Code - Beispiel:
lock(SyncRoot),lock(_syncRoot) - Dies scheint von der äquivalenten
SyncLockAussage von VB beeinflusst zu werden , derSyncRootEigenschaft, die in einigen ICollection-Klassen und einem Teil eines SyncRoot-Entwurfsmusters vorhanden ist (was vermutlich eine schlechte Idee ist). - Da ich mich in einem C # -Kontext befinde, bin ich mir nicht sicher, ob ich eine VBish-Benennung haben möchte. Schlimmer noch, bei VB benennt man die Variable genauso wie das Schlüsselwort. Ich bin mir nicht sicher, ob dies zu Verwirrung führen würde oder nicht.
- Code - Beispiel:
thisLockundlockThisaus den MSDN-Artikeln: C # lock Statement , VB SyncLock Statement- Code - Beispiel:
lock(thisLock),lock(lockThis) - Ich bin mir nicht sicher, ob diese nur für das Beispiel minimal benannt wurden oder nicht
- Etwas seltsam, wenn wir dies in einer
staticKlasse / Methode verwenden. - BEARBEITEN: Der Wikipedia-Artikel über Sperren verwendet diese Benennung auch für sein Beispiel
- Code - Beispiel:
Mehrere Verwendungen von
PadLock(von unterschiedlichem Gehäuse)- Code - Beispiel:
lock(PadLock),lock(padlock) - Nicht schlecht, aber mein einziges Rindfleisch ist, dass es nicht überraschend das Bild eines physischen "Vorhängeschlosses" hervorruft, das ich normalerweise nicht mit dem abstrakten Threading-Konzept verbinde .
- Code - Beispiel:
Benennen der Sperre basierend auf der beabsichtigten Sperre
- Code - Beispiel:
lock(messagesLock),lock(DictionaryLock),lock(commandQueueLock) - Im VB SyncRoot MSDN-Seitenbeispiel gibt es ein
simpleMessageListBeispiel mit einem privatenmessagesLockObjekt - Ich halte es nicht für eine gute Idee, die Sperre für den Typ zu benennen, um den Sie sie sperren ("DictionaryLock"), da dies ein Implementierungsdetail ist, das sich möglicherweise ändert. Ich bevorzuge die Benennung des zu sperrenden Konzepts / Objekts ("messagesLock" oder "commandQueueLock")
- Interessanterweise sehe ich diese Namenskonvention zum Sperren von Objekten in Codebeispielen online oder auf StackOverflow sehr selten .
- Code - Beispiel:
(BEARBEITEN) Die C # -Spezifikation in Abschnitt "8.12 Die Sperranweisung" enthält ein Beispiel für dieses Muster und nennt es
synchronizationObject- Code - Beispiel:
lock(SynchronizationObject),lock(synchronizationObject)
- Code - Beispiel:
Frage: Was halten Sie generell von der Benennung privater Sperrobjekte?
Vor kurzem habe ich angefangen, sie zu benennen ThreadLock(so ähnlich wie Option 3), aber ich stelle fest, dass ich diesen Namen in Frage stelle.
Ich verwende dieses Sperrmuster (im obigen Codebeispiel) häufig in meinen Anwendungen, daher hielt ich es für sinnvoll, eine professionellere Meinung / Diskussion über eine solide Namenskonvention für sie einzuholen. Vielen Dank!
SynchronizationContextes etwas ganz anderes ist.