2010-11-01 7 views
12

Jeder benutzt viel List. Ich muss über diese Liste iterieren, also verwende ich das bekannte SyncRoot Muster.Liste <T> implementiert SyncRoot nicht!

Kürzlich bemerkte ich in this Beitrag, dass die SyncRoot zugunsten von "eingebetteten" Thread-Sicherheit (jede Methode wird auf ein privates Objekt sperren, ohne es mit SyncRoot-Eigenschaft freizugeben) vermieden werden. Ich kann es verstehen, und teilweise stimme ich dem zu.

Die Frage ist, dass List<T> Klasse nicht die SyncRoot Eigenschaft nicht implementiert, auch wenn die ICollection-Schnittstelle implementiert, die die SyncRoot Eigenschaft aus. Ich sage das, Bause den Code

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

geben Sie mir die folgenden Compiler-Fehler:

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

... Wenn dies wahr ist, wie könnte ich eine öffentliche Eigenschaft des Typs Liste <T> synchronisieren, wenn Iterieren darüber?

+1

Ich habe nie SyncRoot im wirklichen Leben gut arbeiten gefunden, wie Sperren auf höherer Ebene besser funktioniert, anstatt nur einzelne Sammlungen sperren –

Antwort

18

Es ist tatsächlich explizit implementiert.

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

Das heißt, Sie zu ICollection es zu benutzen, werfen müssen.

+1

Großartig, es ist richtig. Ich wusste nichts von expliziten Implementierungen, danke. – Luca

+0

Könnte es ratsam sein, eine explizite Implementierung der SyncRoot-Eigenschaft auch für meine eigenen Klassen zu haben? (Ich habe benutzerdefinierte Implementierungen von Sammlungen) Ich denke, es könnte die Verwendung von SyncRoot entmutigen. – Luca

+3

Die Verwendung von SyncRoot wird in der Tat davon abgeraten, aus diesem Grund ist es explizit implementiert. Ich finde Implementierungsmitglieder explizit nützlich, besonders in zwei Szenarien: 1. Die Verwendung des Members hat keine Verwendung außerhalb der Schnittstelle (siehe zum Beispiel dieses Beispiel: http://bit.ly/crLXAz) 2. Das Member wurde nicht implementiert und wirft eine Ausnahme (siehe zum Beispiel dieses Beispiel http://bit.ly/3RFzn4, wobei eine 'Add'-Methode keine Bedeutung für ein' ReadOnlyDictionary' hat). – Steven

Verwandte Themen