2010-11-01 7 views
12

Todos usan mucho de List. Necesito iterar sobre esta lista, entonces utilizo el patrón conocido SyncRoot.¡La lista <T> no implementa SyncRoot!

Recientemente noté en la publicación this que se debe evitar el SyncRoot a favor de la seguridad de hilos "incrustados" (cada método se bloqueará en un objeto privado sin exponerlo usando la propiedad SyncRoot). Puedo entenderlo, y parcialmente estoy de acuerdo con eso.

La cuestión es que List<T> clase no implementa la propiedad SyncRoot, incluso si implementa la interfaz ICollection, que exponga la propiedadSyncRoot. Digo esto Bause el código

List<int> list = new List<int>() 
list.SyncRoot; 

dame el siguiente error de compilación:

error CS0117: 'System.Collections.Generic.List' does not contain a definition for 'SyncRoot'

... Si esto es cierto, ¿cómo podría sincronizar una propiedad pública de la lista Tipo de <T> cuando se repite ¿encima de eso?

+1

Nunca he encontrado que SyncRoot funcione bien en la vida real, ya que el bloqueo tiende a funcionar mejor en un nivel superior, en lugar de simplemente bloquear colecciones únicas –

Respuesta

18

En realidad, se implementa de forma explícita.

object ICollection.SyncRoot 
{ 
    get 
    { 
     if (this._syncRoot == null) 
     { 
      Interlocked.CompareExchange(ref this._syncRoot, new object(), null); 
     } 
     return this._syncRoot; 
    } 
} 

Esto significa que se debe convertir a ICollection usarlo.

+1

Genial, es correcto. No sabía acerca de implementaciones explícitas, gracias. – Luca

+0

¿Podría ser aconsejable tener una implementación explícita de la propiedad SyncRoot incluso en mis propias clases? (Tengo implementaciones personalizadas de colecciones) Creo que podría desalentar el uso de SyncRoot. – Luca

+3

El uso de SyncRoot se desaconseja, por eso se implementa explícitamente. Encuentro que los miembros de implementación son explícitamente útiles, especialmente en dos escenarios: 1. El uso del miembro no tiene uso fuera de la interfaz (vea por ejemplo este ejemplo: http://bit.ly/crLXAz) 2. El miembro no se ha implementado y arroja una excepción (vea por ejemplo este ejemplo http://bit.ly/3RFzn4 donde un método 'Add' no tiene significado en' ReadOnlyDictionary'). – Steven

Cuestiones relacionadas