Вопрос

Я пытаюсь создать класс 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;
    }
}

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

  • Вы можете клонировать объект всякий раз, когда возвращаете его.Обратите внимание, что это будет работать только для клонируемых объектов и будет довольно медленным.
  • Вы можете поддерживать только типы значений.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top