Я оглядывался и до сих пор не смог найти хороший способ сделать это. Я уверен, это обычная проблема.Есть ли в C#/CLR механизм для маркировки возвращаемых значений свойств как для чтения/неизменяемости?
Предположим, у меня есть следующие:
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 */
}
Идея заключалась в том, что я собираюсь реализовать бинарное кучу, и вместо того, поддерживают только Insert() и DeleteMin() операции, я хочу поддержать " peeking "при наивысшем (или самом низком, в зависимости от обстоятельств) значении приоритета в стеке. Никогда не нравился Гейзенберг, и все это «вы не можете смотреть на вещи, не меняя их». Принцип неопределенности. Мусор!
Проблема заключается в том, что вышеизложенное не позволяет предотвратить изменение кода вызова MyVal (при условии SortedCollection) через свойство Top, операция которого имеет четкую возможность поместить мою кучу в неправильном порядке. Есть ли способ предотвратить внесение изменений в внутренние элементы кучи через свойство Top? Или я просто использую код с предупреждением: «Только стабильный, если вы не изменяете какие-либо экземпляры между временем их вставки и dequeue'd. YMMV».
Возможно, вы захотите реализовать неизменяемую очередь приоритетов. Каждая очередь неизменна; добавление или удаление элемента возвращает совершенно новую очередь. У меня есть исходный код C# для такой вещи где-то; Я посмотрю, смогу ли я его выкопать. –
Hrm ... Мне нравится идея, но я не думаю, что она в конечном итоге решает проблему, потому что проблема, которую я ищу, касается недействительности заказа из-за модификации существующего элемента, а не вставки/удаления. – Dathan