Pregunta

Estoy tratando de hacer una clase AtomicReference en C # y quiero mantener protegida la referencia de campo, pero también tengo que devolver el valor en el método 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;
    }
}

Es un poco de una manera torpe solucionar el problema ... No puedo hacer que el campo de sólo lectura, porque tengo que ser capaz de configurarlo. ¿Hay una solución mejor que la mía?

ACTUALIZACIÓN: ¡Gracias por las rápidas respuestas! Se señaló con razón que la referencia será protegida si simplemente regrese _value. También quiero proteger el _value de mutar. Si permito que el _value para mutar fuera del AtomicReference, entonces vence a todo el propósito de hacer esta clase ... ¿hay una manera de lograr eso?

¿Fue útil?

Solución

Incluso si se intenta, no es posible devolver una referencia a un campo en C # (sin código no seguro) o Java. (No me refiero a una referencia a un objeto)

Puede escribir simplemente return _value; las personas que llaman no podrán escribir en el campo.

Otros consejos

C # no admite la palabra clave const C ++ 's, que permite referencias a objetos inmutables mutables.

Sólo hay dos maneras de hacer lo que estás pidiendo.

  • Se puede clonar el objeto cada vez que usted lo vuelva. Tenga en cuenta que esto sólo funcionará para los objetos clonables, y va a ser bastante lento.
  • Sólo se podían apoyar a los tipos de valor.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top