2010-11-01 15 views
12

Tutti usano molto Liste. Ho bisogno di scorrere questa lista, quindi uso il noto pattern SyncRoot.L'elenco <T> non implementa SyncRoot!

Recentemente ho notato nel post this che SyncRoot deve essere evitato a favore della sicurezza del thread "incorporato" (ogni metodo bloccherà un oggetto privato senza esporlo usando la proprietà SyncRoot). Posso capirlo, e in parte sono d'accordo su questo.

La questione è che List<T> classe non implementa la proprietà SyncRoot, anche se implementa l'interfaccia ICollection, che espongono il SyncRoot proprietà. Dico questo Bause il codice

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

darmi il seguente errore del compilatore:

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

... Se questo è vero, come ho potuto sincronizzare una proprietà pubblica di tipo List <T> quando l'iterazione sopra?

+1

Non ho mai trovato SyncRoot che funzioni correttamente nella realtà, poiché il blocco tende a funzionare meglio a un livello superiore, piuttosto che a bloccare singole raccolte –

risposta

18

In realtà è implementato in modo esplicito.

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

Questo significa che è necessario eseguire il cast per ICollection di usarlo.

+1

Grande, è corretto. Non sapevo di implementazioni esplicite, grazie. – Luca

+0

Potrebbe essere consigliabile implementare esplicitamente la proprietà SyncRoot anche sulle mie classi? (Ho implementazioni personalizzate di collezioni) Penso che potrebbe scoraggiare l'utilizzo di SyncRoot. – Luca

+3

L'utilizzo di SyncRoot è infatti scoraggiato, per questo motivo viene implementato in modo esplicito. Trovo i membri di implementazione esplicitamente utili soprattutto in due scenari: 1. L'uso del membro non ha alcun uso al di fuori dell'interfaccia (si veda ad esempio questo esempio: http://bit.ly/crLXAz) 2. Il membro non è stato implementato e lancia un'eccezione (si veda ad esempio questo esempio http://bit.ly/3RFzn4 dove un metodo 'Add' non ha significato su un' ReadOnlyDictionary'). – Steven

Problemi correlati