Ich habe mich umgesehen, und bis jetzt ist es nicht gelungen, einen guten Weg zu finden, dies zu tun. Es ist ein häufiges Problem, da bin ich mir sicher.Enthält C#/CLR einen Mechanismus zum Kennzeichnen der Rückgabewerte von Eigenschaften als schreibgeschützt/unveränderlich?
Angenommen, ich habe folgendes:
class SomeClass : IComparable
{
private int myVal;
public int MyVal
{
get { return myVal; }
set { myVal = value; }
}
public int CompareTo(object other) { /* implementation here */ }
}
class SortedCollection<T>
{
private T[] data;
public T Top { get { return data[0]; } }
/* rest of implementation here */
}
Die Idee dahinter ist, werde ich einen binären Heap implementieren, und anstatt nur unterstützen Insert() und deletemin() -Operationen, ich will "unterstützen spähen "auf den höchsten (oder niedrigsten, je nachdem) Prioritätswert auf dem Stapel. Nie wie Heisenberg, und das ganze "Du kannst die Dinge nicht ansehen, ohne sie zu verändern". Unschärferelation. Müll! Das Problem besteht klar darin, dass das obige keine Möglichkeit bietet, zu verhindern, dass der Aufrufcode MyVal (unter der Annahme von SortedCollection) über die Top-Eigenschaft ändert, wobei diese Operation die eindeutige Möglichkeit hat, meinen Heap in die falsche Reihenfolge zu setzen. Gibt es eine Möglichkeit zu verhindern, dass Änderungen über die Eigenschaft Top auf die internen Elemente des Heapspeichers angewendet werden? Oder verwende ich den Code nur mit einer Warnung: "Nur stabil, wenn Sie keine Instanzen zwischen dem Zeitpunkt, an dem sie eingefügt und aus der Warteschlange entfernt werden, ändern. YMMV."
Sie könnten eine unveränderbare Prioritätswarteschlange implementieren. Jede Warteschlange ist unveränderlich; Hinzufügen oder Entfernen eines Elements gibt eine völlig neue Warteschlange zurück. Ich habe C# Quellcode für so etwas irgendwo herum; Ich werde sehen, ob ich es ausgraben kann. –
Hrm ... Ich mag die Idee, aber ich glaube nicht, dass es letztendlich das Problem löst, denn das Problem, das ich betrachte, ist in Bezug auf die Ungültigkeit der Bestellung aufgrund der Änderung eines vorhandenen Elements, anstatt die Einfügung/Löschvorgänge. – Dathan