C# como proteger o campo de um atômica classe?
-
11-09-2019 - |
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?
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.