我正在尝试在 C# 中创建一个 AtomicReference 类,并且希望保护字段引用,但我还需要在 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