Gibt es in .Net Immutable Collection-Klassen, die keine Mutationsfunktionen haben?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Gibt es in .Net Immutable Collection-Klassen, die keine Mutationsfunktionen haben?

Post by Guest »

Ich suche nach unveränderlichen Sammlungen in c#, insbesondere nach einer Sammlung vom Typ „Liste/Array“ und einer Sammlung vom Typ „Set/Hashset“. Ich stelle klar, ob es „eingebaute“ .net-Typen gibt, die das tun, was ich will (mir ist klar, dass es nicht schwer wäre, meine eigenen zu erstellen).
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;}
}
Dann erkennt jemand, der eine Instanz dieser Klasse verwendet, möglicherweise nicht sofort, dass die Sammlung oder die Klasse unveränderlich ist. Und denken vielleicht, dass sie gehen können:

Code: Select all

Programming101.Studends.Add("fred");
was sie können, aber nicht das tun, was sie erwarten.
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post