Ich habe vor kurzem begonnen, F # für "echte Arbeit" zu verwenden und die Schönheit von unveränderlichen Datenstrukturen wie den diskriminierten Vereinigungen und Aufzeichnungen in F # wiederzuentdecken. Ich habe auch festgestellt, dass sie für C# sehr einfach zu verwenden sind, zumal sie keine direkten Abhängigkeiten von der F # -Laufzeit benötigen. Wenn es jedoch darum geht, Listen in diesen Strukturen darzustellen, habe ich noch keine ideale Lösung gefunden.Was ist die beste Möglichkeit, eine unveränderbare Liste in .NET darzustellen?
Mein erster Versuch war, die Listen als Seq < ‚a> (IEnumerable in der C# Welt) zu geben, die für Mutieren der Sammlung alle Methoden ohne Export der Weg ICollection eine schöne allgemeine Sammlung Schnittstelle bietet <> und seine Freunde tut. Da ich jedoch den Konstruktor einer diskriminierten Union oder eines diskriminierten Datensatzes nicht kontrollieren kann, ist es für den Ersteller einer Instanz dieser Typen möglich, eine IEnumerable-Implementierung bereitzustellen, die sich bei Verwendung ändern oder auslösen kann (z. B. ein LINQ-Ausdruck). . IEnumerable <> wird mir deshalb keine Hilfe vom Compiler geben, um zu beweisen, dass der Wert unveränderlich und daher threadsicher ist.
Meine aktuelle Strategie besteht darin, den F # Listentyp zu verwenden, der eine unveränderbare Sammlung garantiert, aber eine Abhängigkeit von der F # -Laufzeit hinzufügt und bei Verwendung aus nicht F # -Projekten ein wenig ausschaut. Es erlaubt jedoch eine F # Mustererkennung, die IEnumerable < nicht tut. Es gibt auch keine Wahl in der tatsächlichen Darstellung einer Liste, und in einigen Fällen (wie große Listen von primitiven Werten) passt die F # -Listendarstellung nicht wirklich.
Was ich wirklich gerne sehen würde, ist ein unveränderlicher Array-Typ in .NET, der genauso kompakt wie das normale Array dargestellt wird, aber mit einer Compiler-Garantie, dass er nicht mutiert wird. Ich würde const wie in C++ begrüßen, obwohl es wahrscheinlich nicht sehr wahrscheinlich ist. Gibt es noch eine andere Option, die ich verpasst habe?
Nicht einmal F # Listen sind wirklich wirklich unumstößlich, Sie können sie an Ort und Stelle mit Reflektion mutieren (siehe http://de.wikibooks.org/wiki/F_Sharp_Programming/Reflection);) – Juliet
siehe auch http: // stackoverflow .com/questions/3485262/efficient-immutable-extensible-collections-for-net –
Ich würde auch einen zeit- und platzsparenden unveränderlichen Array-Typ lieben; Wir denken darüber nach, die Sprach- und Laufzeitarbeit zu leisten, um es in einer * hypothetischen * zukünftigen Version von C# zu realisieren, aber leider wird es wahrscheinlich nicht über der Mitte der Prioritätenliste landen. (Denken Sie daran, dass alle Überlegungen von Eric über fiktionale Features ohne Budgets, die in unangemeldeten Produkten implementiert sind, nur Unterhaltungszwecken dienen.) –