Mit „unveränderlich“ meine ich, dass Sie es tun sollten Ich kann die Sammlungsinstanz nach der Instanziierung nicht ändern (kein Hinzufügen, Entfernen, Neuanordnen von Elementen usw. – die Reihenfolge ist mir egal)
Jetzt hat .Net die ImmutableXXX-Sammlungen, aber diese habe für mich den größten Nachteil, die Mutationsfunktionen ihrer veränderlichen Äquivalente weiterhin einzubeziehen. ZB hat ImmutableList eine Add-Funktion. Was noch schlimmer ist, ist, dass diese Funktionen „funktionieren“, aber etwas völlig anderes tun als bei den veränderlichen Versionen; Anstatt die aktuelle Instanz zu ändern, geben sie eine neue Sammlungsinstanz zurück, die eine Kopie der aktuellen mit der angewendeten Operation ist.
Das Problem dabei ist, dass es Ihr Team darauf vorbereitet nicht sofort offensichtliche Fehler. Wenn Sie eine Klasse haben, die Eigenschaften enthält, die unveränderliche Sammlungen sind, z. B.:
Code: Select all
class Class
{
public ImmutableList Students {get;init;}
}
Code: Select all
Programming101.Studends.Add("fred");
Das ist besonders schlimm, wenn Sie refaktorisieren eine Klasse, um sie unveränderlich zu machen – ein nicht allzu ungewöhnliches Ereignis, denke ich.
Außerdem scheinen die unveränderlichen Sammlungen ein wenig über .Net verstreut zu sein. ImmutableXXX hat beispielsweise keine Set- oder HashSet-Variante. Es gibt ein FrozenSet, und das löst zumindest eine Ausnahme aus, wenn Sie versuchen, die Add-Methode aufzurufen (wird nur implementiert, um die ICollection-Implementierung zu erfüllen), aber die FrozenXXX-Sammlungen enthalten nur Set und Dictionary.
Eine andere Option wäre natürlich die Verwendung der IReadonlyXXX-Schnittstellen wie IReadonlyList.
Aber das Problem dabei ist, wenn ich es in meinem obigen Beispiel anstelle von ImmutableList verwenden würde, dann könnte es jemand tun Initialisieren Sie die Schüler mit einer Liste und ändern Sie diese Liste später separat (damit sie einen Verweis auf außerhalb des Klassenobjekts beibehalten), wodurch die Unveränderlichkeit der Klasse aufgehoben wird.
Die einzige andere Option wäre um sicherzustellen, dass „Students“ immer innerhalb der Klasse erstellt wird. Wenn Sie jedoch eine Instanz von „Class“ mit einer vorhandenen Sammlung von Studenten initialisieren möchten, müsste diese Sammlung kopiert werden. Einer der Vorteile von unveränderlichen Objekten (wie den ImmutableXXX-Sammlungen) besteht darin, dass Sie sie zum Initialisieren anderer unveränderlicher Objekte verwenden können und das neue Objekt einfach auf die vorhandene unveränderliche Sammlung verweisen kann, da Sie wissen, dass es sich nicht ändern kann.
Nach all dem, kurz gesagt: Ich suche nach etwas, das funktional den ImmutableXXX-Sammlungen entspricht, aber nicht über die Mutationsfunktionen verfügt oder zumindest keine Ausnahmen auslöst wenn Sie versuchen, sie anzurufen. Somit würde FrozenSet meinen Bedarf an einem Set erfüllen, aber es scheint kein List/Array-Äquivalent zu geben?