사용자 정의 Lazy<T>
클래스를 구현하려는 경우에만 구현하고 싶습니다. 흥미로운 점은 생성자에 함수를 전달할 때 디버거에서 실제 호출이 Value
인데도 객체가 함수 내부에서 만들어진 것을 볼 수 있다는 것입니다. 이것은 디버거가 _func
을 평가하기 때문입니까 아니면 Func<>
이 작동하는지 이해할 수 없습니까? Visual Studio에서 디버거를 호출하기 전에 func를 평가합니다.
class Program
{
static void Main(string[] args)
{
var lazyObj = new LazyTest<Entity>(() => new Entity { Foo = 5 }); // Debugger shows that Entity is already created here and Foo = 5.
var entity = lazyObj.Value; // Creation of Entity should happen here.
Console.WriteLine(entity.Foo);
Console.Read();
}
}
public class Entity
{
public int Foo { get; set; }
}
public class LazyTest<T>
{
private T _value;
public T Value
{
get
{
if (_value == null)
_value = _func();
return _value;
}
}
private Func<T> _func { get; set; }
public LazyTest(Func<T> func)
{
_func = func;
}
나는
Lazy<T>
내부적 특성
internal T ValueForDebugDisplay
를 사용하는 것을 발견,하지만 내 질문에 대한 답변입니다 있는지 확실 100 % 아니에요.
하지만 내 현재 구현은 실제로 개체를 만들지 또는 디버거가이를 표시 할 목적으로 개체를 만드나요? 메모리에 객체가 할당되는 시점은 언제입니까? 'Value' 또는 이후에 전화하기 전에? – FCin
디버거가 그것을 생성하여 로컬 창에 표시합니다. 디버거가 중단 점에 도달했을 때 발생합니다. 위의 문제에 접근하기위한 몇 가지 방법을 추가했습니다. 행운을냅니다. –
사실, 당신 말이 맞습니다. 나는'Console.WriteLine'을 삽입하여 인쇄 될 때를 보았고'Value'를 호출하거나 디버거의'Value'를 보았을 때 인쇄되는 것으로 밝혀졌습니다. – FCin