Я пытаюсь создать класс AtomicReference в C # и хочу сохранить ссылку на поле защищенной, но мне также нужно вернуть значение в методе get:
class AtomicReference
{
private Object _value;
public AtomicReference()
{
_value = new Object();
}
public AtomicReference(Object value)
{
OptimisticSet(value);
}
public Object CompareAndSet(Object newValue)
{
return Interlocked.Exchange(ref _value, newValue);
}
public void OptimisticSet(Object newValue)
{
do {
} while (_value == Interlocked.CompareExchange(ref _value, _value, newValue));
}
public Object Get()
{
// Don't leak the field reference
const Object constVal = _value;
return constVal;
}
}
Это немного неуклюжий способ решения проблемы ... Я не могу сделать поле доступным только для чтения, потому что мне нужно иметь возможность его установить. Есть ли лучшее решение, чем у меня?
UPDATE:
Спасибо за быстрый ответ!
Было справедливо указано, что ссылка будет защищена, если я просто верну _value. Я также хочу защитить _value от мутирования. Если я позволю _value видоизменяться за пределами AtomicReference, то это разрушает всю цель создания этого класса ... есть ли способ достичь этого?