2011-02-04 2 views
16

누구나 Microsoft가 ClearField() 메서드 나 IsDirty 속성 또는 .NET Framework 4.0의 Lazy < T> 클래스를 포함하지 않는 이유를 알고 있습니까? (아래에서 업데이트 된 질문)게으른 <T> 재 초기화 방법?

우리는 .NET 3.5 이후로 우리가 사용하고있는 자작 (homebrew) 타입을 가지고 있습니다. 내가 일하는 곳은 Lazy < T> 클래스와 똑같은 일을하지만, 인스턴스가 Lazy Func을 재평가하도록 허용합니다 . 우리는 클래스를 새로운 .NET으로 대체하려고합니다. 그러나이 Clear() 또는 IsDirty 메커니즘은 존재하지 않습니다.

의견을 바탕으로 원래 질문을 다시 말하게하십시오. 클래스를 다시 인스턴스화하지 않고 Lazy < T> Func 메서드를 다시 초기화하는 방법이 있습니까? 그렇지 않다면 확장 메소드로 구현하는 방법이 있을까요 아니면 처음부터 따라야 할 나쁜 패턴일까요?

+7

"왜하지 않았습니까?"라는 질문은 단지 분노입니다. 이것을 좀 더 건설적인 방식으로 바꿀 수 있습니까? –

+0

확장 메서드 추가 ... –

+0

값으로 볼 수 있고 다른 값이 같은 값이 아니기 때문에 추측합니다. – Skurmedel

답변

10

스레드로부터 안전하게 만들 수 없으므로. 프로그래머가 문제를 해결할 수있는 방법없이 다리를 쏠 것이라고 보장하는 클래스는 프레임 워크에 속하지 않습니다. 너는 너의 자신의 다리를 떨어져 쏘는 것이 자유 롭다.

+2

스레드 안전은 Lazy 클래스의 옵션이며, 심지어 기본값이 아닐 수도 있습니다. 그러므로이 대답은 많이 적용되지 않습니다. – flq

+1

스레드를 안전하게 할 수없는 이유는 무엇입니까? 잠금 블록 안의 업데이트와 두 개의 속성 ('IsValueCreated'와'Value')에 대한 여분의 잠금이 아닌가요? 나는 멀티 스레딩에 대한 전문가는 아니지만 첫눈에 알맞은 것 같습니다 ... – user2173353

1

IsValueCreated가 작동하지 않습니까?

+1

IsValueCreated는 읽기 전용입니다 ... 속성에 setter가 있고 다음 사용시 재 초기화가 발생하면 발생합니다. –

6

당신이하고 싶은 일은 게으른 초기화가 아니라 다른 것입니다. 그것이 Lazy<T> 클래스에없는 이유입니다.

4

이렇게하면 형식의 의미가 깨질 수 있습니다. Lazy<T>의 상태가 시간이 지남에 따라 무효가되면 다른 유형을 고려해야합니다.

2

Lazy <> 개체를 재설정해야하는 경우 Lazy <> 유형의 새 인스턴스를 만들 수있는 메커니즘이 필요합니다. Lazy <> type과 Reset-method와 동일한 속성을 표시하는 래퍼를 만들면 간단하게 다시 작성할 수 있습니다. 진짜 문제는 당신이 그런 일을해야하지만, 당신이 정말로 필요한 경우 즉, 사용자의 요구에 충분히있을 수 있습니다

public class ResettableLazy<T> 
{ 
    public T Value => this.Container.Value; 
    public bool IsValueCreated => this.Container.IsValueCreated; 
    public void Reset() { this.Container = new Lazy<T>(); } 
    private Lazy<T> Container = new Lazy<T>(); 
} 

: 간단히 말해이 같은 것을 할 것이다.

관련 문제