C# как защитить поле атомарного класса?
-
11-09-2019 - |
Вопрос
Я пытаюсь создать класс 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;
}
}
Это немного неуклюжий способ решения проблемы...Я не могу сделать поле доступным только для чтения, потому что мне нужно иметь возможность его установить.Есть ли лучшее решение, чем мое?
ОБНОВЛЯТЬ:Спасибо за быстрые ответы!Справедливо было отмечено, что ссылка будет защищена, если я просто верну _value.Я также хочу защитить _value от изменения.Если я позволю _value изменяться за пределами AtomicReference, то это сводит на нет всю цель создания этого класса...есть ли способ добиться этого?
Решение
Даже если вы попытаетесь, вернуть ссылку на поле в C# (без небезопасного кода) или Java невозможно.(Я не имею в виду ссылку на объект)
Вы можете просто написать return _value;
ваши абоненты не смогут писать в поле.
Другие советы
C# не поддерживает C++ const
Ключевое слово, которое позволяет использовать неизменяемые ссылки на изменяемые объекты.
Есть только два способа сделать то, о чем вы просите.
- Вы можете клонировать объект всякий раз, когда возвращаете его.Обратите внимание, что это будет работать только для клонируемых объектов и будет довольно медленным.
- Вы можете поддерживать только типы значений.