0

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 の外で変化することを許可すると、このクラスを作成する目的全体が無効になります...それを達成する方法はありますか?

4

2 に答える 2

3

試しても、C# (アンセーフ コードなし) または Java のフィールドへの参照を返すことはできません。(オブジェクトへの参照という意味ではありません)

return _value;発信者がフィールドに書き込むことができないようにするだけです。

于 2009-12-02T02:11:08.773 に答える
2

constC# は、可変オブジェクトへの不変参照を可能にする C++ のキーワードをサポートしていません。

あなたが求めていることを行うには2つの方法しかありません。

  • オブジェクトを返すたびに、オブジェクトを複製できます。これは複製可能なオブジェクトに対してのみ機能し、非常に遅くなることに注意してください。
  • 値型のみをサポートできます。
于 2009-12-02T02:36:45.260 に答える