C# 원자 클래스의 필드를 보호하는 방법은 무엇입니까?
-
11-09-2019 - |
문제
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
변한 객체에 대한 불변의 참조를 허용하는 키워드.
당신이 요구하는 일을하는 방법에는 두 가지뿐입니다.
- 반환 할 때마다 객체를 복제 할 수 있습니다. 이것은 복제 가능한 물체에만 효과가 있으며 매우 느립니다.
- 값 유형 만 지원할 수 있습니다.
제휴하지 않습니다 StackOverflow