C# で AtomicReference クラスを作成しようとしていて、フィールド参照を保護したままにしたいのですが、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 の外で変化することを許可すると、このクラスを作成する目的全体が無効になります...それを達成する方法はありますか?