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. Beispielsweise verfügt ImmutableList über eine Funktion zum Hinzufügen. 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 (implementiert nur, 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 in meinem oben genannten Beispiel, ich habe es stattdessen verwendet ImmutableList, dann könnte jemand Students mit einer List initialisieren und diese Liste später separat ändern (damit er einen Verweis auf außerhalb des Class-Objekts beibehält), wodurch die Unveränderlichkeit der Klasse unterbrochen wird.< /p>
Die einzige andere Möglichkeit wäre sicherzustellen, dass Students immer innerhalb der Klasse erstellt werden. Das bedeutet jedoch, dass diese Sammlung dies tun müsste, wenn Sie eine Instanz von Class mit einer vorhandenen Sammlung von Studenten initialisieren möchten 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 du Versuchen Sie, sie anzurufen. Als solches würde FrozenSet meinen Bedarf an einem Set erfüllen, aber es scheint kein List/Array-Äquivalent zu geben?