Domanda

Sto cercando di fare una classe AtomicReference in C # e voglio mantenere protetto il riferimento del campo, ma ho anche bisogno di restituire il valore nel metodo 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;
    }
}

E 'un po' un modo maldestro per aggirare il problema ... non riesco a rendere il campo di sola lettura, perché ho bisogno di essere in grado di impostarlo. C'è una soluzione migliore del mio?

UPDATE: Grazie per le risposte veloci! E 'stato giustamente sottolineato che il riferimento sarà protetto se semplicemente restituire _value. Voglio anche per proteggere il _value dalla mutazione. Se Acconsento al _value di mutare al di fuori della AtomicReference, allora sconfigge l'intero scopo di rendere questa classe ... c'è un modo per raggiungere questo?

È stato utile?

Soluzione

Anche se si prova, non è possibile per restituire un riferimento a un campo in C # (senza codice non sicuro) o Java. (Non voglio dire un riferimento a un oggetto)

Si può semplicemente scrivere return _value; i chiamanti non saranno in grado di scrivere al campo.

Altri suggerimenti

C # non supporta const parola chiave C ++ s ', che consente di riferimenti immutabili ad oggetti mutabili.

Ci sono solo due modi per fare quello che stai chiedendo.

  • Si potrebbe clonare l'oggetto ogni volta che lo restituite. Si noti che questo funziona solo per gli oggetti clonabili, e sarà piuttosto lento.
  • Si poteva solo supportare i tipi di valore.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top