Warum ist HashSet .IsReadOnly explizite?
-
09-09-2019 - |
Frage
Das
var h = new HashSet<int>();
var r = h.IsReadOnly;
lässt sich nicht kompilieren. Ich habe zu tun
var r = ((ICollection<int>)h).IsReadOnly;
Warum wurde nicht IsReadOnly implementiert normalerweise?
(Ich bin nicht gefragt wie , sondern Warum )
Lösung
Ich vermute, seine weil, während HashSet implementiert ICollection, IsReadOnly keine Bedeutung für HashSet hat. In der Tat, wenn Sie darüber nachdenken, gibt die Eigenschaft immer false. Die Implementierung versteckt es explizit diese Methode von der öffentlichen Schnittstelle.
Ein weiterer Grund ist, weil die Schnittstelle ICollection wegen zufälligen Gründen implementiert werden kann (beispielsweise XAML-Serialisierung zu unterstützen) und nicht, weil sein notwendig, um die primäre Verwendung der Klasse. So ist es die Umsetzung ausdrücklich die Unordnung aus der Klasse Schnittstelle halten kann.
Andere Tipps
Es gibt grundsätzlich zwei Gründe, warum Sie auf eine explizite Schnittstellenimplementierung zurückgreifen würden (Quelle: MSDN ):
- implementieren Sie mehrere Schnittstellen mit den Mitgliedern die gleichen Signaturen enthalten, und Sie wollen, dass diese Mitglieder sich anders verhalten.
- Ein Schnittstelle Mitglied ist nicht von besonderem Interesse für die Klasse, sondern um Referenzobjekte von der Schnittstelle erforderlich.
Für HashSet<T>
, letztere Fall gilt, wie ein Hash-Set wird nie nur lesen und IsReadOnly
wird somit immer false
zurück.