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 )

War es hilfreich?

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 ):

  1. implementieren Sie mehrere Schnittstellen mit den Mitgliedern die gleichen Signaturen enthalten, und Sie wollen, dass diese Mitglieder sich anders verhalten.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top