2009-04-13 5 views
12

DieseWarum ist HashSet <T> .IsReadOnly explizit?

var h = new HashSet<int>(); 
var r = h.IsReadOnly; 

nicht kompiliert. Ich habe

var r = ((ICollection<int>)h).IsReadOnly; 

zu tun, warum nicht IsReadOnly normalerweise umgesetzt wurde?

(Ich frage nicht, wie , aber warum)

Antwort

16

Ich vermute, seine weil, während HashSet implementiert ICollection, IsReadOnly keine Bedeutung für HashSet hat. In der Tat, wenn Sie es widerspiegeln, gibt die Eigenschaft immer false zurück. Wenn Sie es implementieren, wird diese Methode explizit von der öffentlichen Schnittstelle ausgeblendet. Ein weiterer Grund besteht darin, dass die ICollection-Schnittstelle aus zufälligen Gründen implementiert werden kann (z. B. um XAML-Serialisierung zu unterstützen) und nicht, weil sie für die primäre Verwendung der Klasse erforderlich ist. Die explizite Implementierung kann die Unordnung aus der Oberfläche der Klasse heraushalten.

+0

Ah, ja, das macht Sinn. HashSet verbirgt auch IsReadOnly aus dem gleichen Grund, den ich vermute, daher der Kompilierungsfehler, wenn Sie versuchen, es zu verwenden. –

+0

BTW, Sie müssen ICollection für Xaml-Serialisierung nicht implementieren; Sammlungen müssen IDictionary oder IList implementieren. Es war nur ein Beispiel für Situationen, in denen Sie eine Schnittstelle aus zwingenden Gründen implementieren müssen. – Will

5

Grundsätzlich gibt es zwei Gründe, warum Sie auf eine explizite Schnittstellenimplementierung (Quelle: MSDN): greifen würde

  1. Sie implementieren mehrere Schnittstellen mit Mitgliedern enthalten, die gleichen Signaturen, und Sie wollen, dass diese Mitglieder sich anders verhalten.
  2. Ein Schnittstellenelement ist für die Klasse nicht von besonderem Interesse, wird aber benötigt, um Objekte über die Schnittstelle zu referenzieren.

Für HashSet<T>, gilt der letztere Fall, als ein Hash-Set nur nie gelesen und IsReadOnly wird somit immer false zurück.

Verwandte Themen