문제

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가 원자 계층 외부에서 돌연변이되도록하는 경우이 클래스를 만드는 전체 목적을 물리칩니다 ...이를 달성 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

시도하더라도 C# (안전하지 않은 코드없이) 또는 Java의 필드에 대한 참조를 반환 할 수 없습니다. (나는 개체에 대한 언급을 의미하지 않습니다)

당신은 단순히 쓸 수 있습니다 return _value; 발신자는 현장에 편지를 쓸 수 없습니다.

다른 팁

C#은 C ++를 지원하지 않습니다 const 변한 객체에 대한 불변의 참조를 허용하는 키워드.

당신이 요구하는 일을하는 방법에는 두 가지뿐입니다.

  • 반환 할 때마다 객체를 복제 할 수 있습니다. 이것은 복제 가능한 물체에만 효과가 있으며 매우 느립니다.
  • 값 유형 만 지원할 수 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top