0

我正在尝试在 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 之外发生变异,那么它就违背了制作这个类的全部目的......有没有办法实现这一点?

4

2 回答 2

3

即使您尝试,也不可能在 C#(没有不安全代码)或 Java 中返回对字段的引用。(我不是指对对象的引用)

您可以简单地写入return _value;您的调用者将无法写入的字段。

于 2009-12-02T02:11:08.773 回答
2

C# 不支持 C++ 的const关键字,该关键字允许对可变对象的不可变引用。

只有两种方法可以满足您的要求。

  • 您可以在返回对象时克隆该对象。请注意,这仅适用于可克隆对象,而且速度会很慢。
  • 您只能支持值类型。
于 2009-12-02T02:36:45.260 回答