C # как защитить поле атомного класса? - PullRequest
0 голосов
/ 02 декабря 2009

Я пытаюсь создать класс AtomicReference в C # и хочу сохранить ссылку на поле защищенной, но мне также нужно вернуть значение в методе 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;
    }
}

Это немного неуклюжий способ решения проблемы ... Я не могу сделать поле доступным только для чтения, потому что мне нужно иметь возможность его установить. Есть ли лучшее решение, чем у меня?

UPDATE: Спасибо за быстрый ответ! Было справедливо указано, что ссылка будет защищена, если я просто верну _value. Я также хочу защитить _value от мутирования. Если я позволю _value видоизменяться за пределами AtomicReference, то это разрушает всю цель создания этого класса ... есть ли способ достичь этого?

Ответы [ 2 ]

3 голосов
/ 02 декабря 2009

Даже если вы попытаетесь, невозможно вернуть ссылку на поле в C # (без небезопасного кода) или Java. (Я не имею в виду ссылку на объект)

Вы можете просто написать return _value; ваши абоненты не смогут писать в поле.

2 голосов
/ 02 декабря 2009

C # не поддерживает ключевое слово const в C ++, которое допускает неизменные ссылки на изменяемые объекты.

Есть только два способа сделать то, что вы просите.

  • Вы можете клонировать объект всякий раз, когда его возвращаете. Обратите внимание, что это будет работать только для клонируемых объектов и будет довольно медленным.
  • Вы можете поддерживать только типы значений.
...