Frage

Ich versuche, eine Atomicreference -Klasse in C# zu erstellen, und ich möchte die Feldreferenz geschützt halten, aber ich muss auch den Wert in der GET -Methode zurückgeben:

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;
    }
}

Es ist ein bisschen ungeschickt um das Problem ... Ich kann das Feld nicht readonly machen, weil ich es in der Lage sein muss, es einzustellen. Gibt es eine bessere Lösung als meine?

Update: Danke für die schnellen Antworten! Zu Recht wurde darauf hingewiesen, dass die Referenz geschützt wird, wenn ich einfach den Wert zurückgehe. Ich möchte auch den Wert vor der Mutation schützen. Wenn ich den Wert von _Value außerhalb der Atomikreferenz mutieren kann, dann ist er den gesamten Zweck, diese Klasse zu machen, ... Gibt es eine Möglichkeit, dies zu erreichen?

War es hilfreich?

Lösung

Selbst wenn Sie es versuchen, ist es nicht möglich, einen Verweis auf ein Feld in C# (ohne unsicheren Code) oder Java zurückzugeben. (Ich meine keinen Hinweis auf ein Objekt)

Sie können einfach schreiben return _value; Ihre Anrufer können nicht in das Feld schreiben.

Andere Tipps

C# unterstützt C ++ nicht const Schlüsselwort, das unveränderliche Verweise auf veränderliche Objekte ermöglicht.

Es gibt nur zwei Möglichkeiten, das zu tun, was Sie fragen.

  • Sie können das Objekt klonen, wenn Sie es zurückgeben. Beachten Sie, dass dies nur für klonbare Objekte funktioniert und es ziemlich langsam ist.
  • Sie können nur Werttypen unterstützen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top