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 ::

  1. Todo el mundo parece estar respondiendo al valortype case, ¡ya lo sé!
  2. 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;)
  3. 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)
¿Fue útil?

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.

Fuente

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top