문제

나는 정확히 내 재산이 초기화 될 때에 대해 약간 혼란스러워합니다.

다음과 같이 선언 된 속성이 있다고 가정합니다.

private Dictionary<string, Dictionary<string,string>> MessageLookup
    {
        get
        {
           return messages ?? doSomething();
        }
    }

복용량 메소드는 메시지 사전을 채우고 반환합니다.

내 질문은 언제이 코드가 실행됩니까? DoSomething 코드에 중단 점을 배치하면 적중하지 않지만 Debugger에서 볼 때 Messagelookup 속성이 데이터를 보유하고 있습니다 (여기에 초기화 된 유일한 장소).

이 코드는 건설시 실행됩니까? 변수 이름을 가리킬 때 디버거가 자동으로 실행됩니까? 그렇다면 왜 브레이크 포인트가 맞지 않습니까?

도움이 되었습니까?

해결책

이 코드는 누군가가 아닌 속성을 언급 할 때마다 실행됩니다.

디버거를 사용하는 경우 디버거가 속성 값을 자동으로 가져 오려고 시도하기 때문에 볼 수 있습니다 (따라서 객체의 상태를 볼 수 있음). 디버거가 브레이크 포인트를 무시하는 동안 자체적으로 속성을 평가하는지 모르겠습니다. 모든 것을 설명 할 것입니다.

코드를 실행해보십시오 ~ 아니다 디버거에서 일부 코드에 액세스하십시오.

var lookup = someObject.MessageLookup;

만들다 doSomething() 스택 추적을 버리면 무슨 일이 일어나고 있는지 알 수 있습니다.

다른 팁

귀하의 재산이 처음 평가 될 때 실행됩니다. 배경 일이 일어나지 않습니다.

QuickWatch를 사용하여 객체를 검사하기 때문에 이것을보고 있지 않은 것 같습니다. 이 시점에서 실행되고 중단 점이 건너 뜁니다.

속성 getters (및 ToString() 그 문제에 대해) 순수한, 기본적으로 부작용이 없다는 것을 의미합니다. 해당 가정을 준수하려면 코드를 다시 작성해야합니다. 불쾌한 결과. 액세스 시간에 게으른 초기화를 사용해야하는 경우 GetMessageLookup() 대신 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top