Una pregunta relativamente menor, pero no he podido encontrar documentación oficial ni siquiera opiniones de blog / debates sobre ella.
En pocas palabras: cuando tengo un objeto privado cuyo único propósito es servir para privado lock
, ¿qué nombre le doy a ese objeto?
class MyClass
{
private object LockingObject = new object();
void DoSomething()
{
lock(LockingObject)
{
//do something
}
}
}
¿Qué deberíamos nombrar LockingObject
aquí? También considere no solo el nombre de la variable, sino también cómo se ve en el código cuando se bloquea.
He visto varios ejemplos, pero aparentemente no hay ningún consejo sólido:
Muchos usos de
SyncRoot
(y variaciones como_syncRoot
).- Código de ejemplo:
lock(SyncRoot)
,lock(_syncRoot)
- Esto parece estar influenciado por la
SyncLock
declaración equivalente de VB , laSyncRoot
propiedad que existe en algunas de las clases de ICollection y parte de algún tipo de patrón de diseño de SyncRoot (que posiblemente sea una mala idea) - Al estar en un contexto C #, no estoy seguro de si me gustaría tener un nombre VBish. Peor aún, en VB nombrar la variable igual que la palabra clave. No estoy seguro de si esto sería una fuente de confusión o no.
- Código de ejemplo:
thisLock
ylockThis
de los artículos de MSDN: Declaración de bloqueo de C # , Declaración de sincronización de VB- Código de ejemplo:
lock(thisLock)
,lock(lockThis)
- No estoy seguro si estos fueron nombrados mínimamente puramente para el ejemplo o no
- Un poco extraño si estamos usando esto dentro de una
static
clase / método. - EDITAR: el artículo de Wikipedia sobre cerraduras también utiliza este nombre para su ejemplo
- Código de ejemplo:
Varios usos de
PadLock
(de carcasa variable)- Código de ejemplo:
lock(PadLock)
,lock(padlock)
- No está mal, pero mi único problema es que, como era de esperar, invoca la imagen de un "candado" físico que tiendo a no asociar con el concepto abstracto de enhebrado .
- Código de ejemplo:
Nombrar el bloqueo en función de lo que pretende bloquear
- Código de ejemplo:
lock(messagesLock)
,lock(DictionaryLock)
,lock(commandQueueLock)
- En el ejemplo de la página VB SyncRoot MSDN, tiene un
simpleMessageList
ejemplo con unmessagesLock
objeto privado - No creo que sea una buena idea nombrar el bloqueo contra el tipo que está bloqueando ("DictionaryLock"), ya que es un detalle de implementación que puede cambiar. Prefiero nombrar alrededor del concepto / objeto que está bloqueando ("messagesLock" o "commandQueueLock")
- Curiosamente, rara vez veo esta convención de nomenclatura para bloquear objetos en ejemplos de código en línea o en StackOverflow.
- Código de ejemplo:
(EDITAR) La especificación de C # en la sección "8.12 La Declaración de bloqueo" tiene un ejemplo de este patrón y lo nombra
synchronizationObject
- Código de ejemplo:
lock(SynchronizationObject)
,lock(synchronizationObject)
- Código de ejemplo:
Pregunta: ¿Cuál es su opinión general acerca de nombrar objetos de bloqueo privados ?
Recientemente, comencé a nombrarlos ThreadLock
(algo así como la opción 3), pero me encuentro cuestionando ese nombre.
Con frecuencia utilizo este patrón de bloqueo (en el ejemplo de código proporcionado anteriormente) en todas mis aplicaciones, por lo que pensé que podría tener sentido obtener una opinión / discusión más profesional sobre una convención de nomenclatura sólida para ellos. ¡Gracias!
fuente
SynchronizationContext
es algo bastante diferente.Normalmente lo llamo
locker
, pero como es privado, creo que es un detalle de implementación algo sin importancia. Primera regla general, use los estándares de su equipo / empresa. Si no hay uno, bueno, por favor haga uno y úselo, pero al hacerlo, mantenga las cosas simples. Si su clase tiene un único objeto de bloqueo, llamarlofoo
es lo suficientemente bueno. Si tiene muchos, un buen orden del día podría ser simplemente revisar el diseño de esa clase primero para ver si está haciendo demasiadas cosas diferentes. Pero, si no, entonces el nombre se vuelve importante, como en este ejemplo completamente inventado:fuente
Siempre usé lck_. De esa manera, si presiona Ctrl + f 'lck', entonces solo debe encontrar los bloqueos, mientras que 'lock' también encontrará cosas como 'clock'.
Cosas como lockThis y Padlock están bien para las carteras uni, pero para los proyectos adecuados realmente debería usar nombres semánticos para que cuando mire las declaraciones sepa lo que el objeto realmente hace sin buscar a través del código.
fuente