質問

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 が変更されないように保護したいと考えています。AtomicReference の外部で _value が変化することを許可すると、このクラスを作成する目的全体が無効になります...それを達成する方法はありますか?

役に立ちましたか?

解決

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

あなたは、単にあなたの発信者がフィールドに書き込むことができませんreturn _value;書くことができます。

他のヒント

C# は C++ をサポートしていません const キーワード。これにより、可変オブジェクトへの不変参照が可能になります。

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

  • オブジェクトを返すたびに、オブジェクトのクローンを作成できます。これは複製可能なオブジェクトに対してのみ機能し、非常に時間がかかることに注意してください。
  • サポートできるのは値型のみです。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top