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 rollen).
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; }
}
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 (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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post