Pergunta

Eu estou tentando fazer um AtomicReference classe em C# e eu quero manter a referência de campo protegido, mas eu também preciso devolver o valor na 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;
    }
}

Ele é um pouco desajeitado maneira de contornar o problema...Eu não posso fazer o campo só de leitura, porque eu preciso ser capaz de defini-lo.Existe uma solução melhor do que a minha?

ATUALIZAÇÃO:Obrigado pela resposta rápida!Foi justamente apontou que a referência será protegido se eu simplesmente retornar _value.Eu também quero proteger o _value de mutação.Se eu permitir que o _value para mutação fora da AtomicReference, em seguida, ele derrota todo o propósito de fazer esta aula...existe uma maneira de conseguir isso?

Foi útil?

Solução

Mesmo se você tentar, não é possível retornar uma referência a um campo em C# (sem código inseguro) ou Java. (Não quero dizer uma referência a um objeto)

Você pode simplesmente escrever return _value; Seus chamadores não poderão escrever para o campo.

Outras dicas

C# não suporta C++'s const palavra-chave, o que permite imutável referências para objetos mutáveis.

Existem apenas duas maneiras de fazer o que você está pedindo.

  • Você pode clonar o objeto sempre que você retornar a ele.Note que isto apenas irá funcionar para clonable objetos, e vai ser muito lenta.
  • Você poderia apenas suporte de tipos de valor.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top