C # come proteggere il campo di una classe atomica?
-
11-09-2019 - |
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?
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.