¿La cerradura asigna
-
10-07-2019 - |
Pregunta
Leí en alguna parte, aunque no recuerdo dónde, que puede usar la palabra clave de bloqueo en C #.
Sé que intentar bloquear un ValueType encajonará el tipo de valor, pero ¿hay alguna otra situación?
EDITAR ::
- Todo el mundo parece estar respondiendo al valortype case, ¡ya lo sé!
- También sé qué son las cerraduras y cómo usarlos en gran profundidad, El consejo general sobre las mejores prácticas es agradable, pero inútil;)
- necesito sé porque estoy construyendo una aplicación XNA para implementación en xbox. El xbox el recolector de basura es realmente lento Esto significa que necesito mantener asignaciones a un mínimo, preferiblemente inexistente (lo que impide la colector de alguna vez ejecutando)
Solución
Si bien la asignación interna del bloque de sincronización see es perezosa (pero ese es un detalle de implementación que IIRC conozco del 'volumen 1' de Essential.NET, o es CLR a través de C #, y debería tratarse solo como eso), lo simple caso de que el elemento necesite ser encuadrado como si estuviera sugiriendo que no se presenta, vea ¿Por qué el bloqueo (< integer var >) no está permitido, pero Monitor.Enter (< integer var >) permitido?
Otros consejos
Si estaba pensando en usar:
bloquear (esto)
Debe saberlo porque está buscando en su instancia, los usuarios de su la clase también podría bloquearlo y fastidiarte. Si eso es o no un el problema depende de lo que pienses que podrían hacer tus usuarios. La misma situación existe si estás haciendo:
lock (typeof (MyClass))
Si no desea hacer esto, puede asignar fácilmente una estática o instancia objeto (es decir, objeto myLock = nuevo objeto ()), y luego bloquearlo.
En cuanto a bloquear un tipo de referencia vs tipo de valor , esto Pregunta SO sobre Bloquear un recurso cuando se obtiene ... tiene la respuesta:
Depende del tipo, si un tipo de referencia entonces sí, si un valor tipo no. Esta es también la razón por la que deberías nunca, nunca bloquee un tipo de valor desde el tipo de valor será encuadrado y cualquier intentos posteriores de bloquear eso valor realmente adquirirá un bloqueo en un objeto diferente.
Definición de la declaración de bloqueo:
Declaración de bloqueo (Referencia de C #)
La palabra clave de bloqueo marca una declaración bloquear como una sección crítica por obtener el bloqueo de exclusión mutua para un objeto dado, ejecutando un declaración, y luego liberando el bloquear.
Esta SO pregunta sobre la palabra clave de bloqueo en C # puede ayudar. También puede consultar Por qué lock () es no permitido, pero Monitor.Enter () permitido?
La especificación para el compilador define el comportamiento de bloqueo así :
El tipo de tiempo de compilación de la expresión de una declaración de bloqueo deberá ser un tipo de referencia o un > tipo parámetro (& # 167; 25.1.1) conocido por ser un tipo de referencia. Es un tiempo de compilación error para el tipo de tiempo de compilación de expresión para denotar un tipo de valor.