C# Visual studio在调用func之前在调试器中对其求值

C# Visual studio在调用func之前在调试器中对其求值,c#,debugging,lazy-loading,func,C#,Debugging,Lazy Loading,Func,我想实现定制的Lazy类,就是为了实现它。有趣的是,当我将函数传递给构造函数时,在调试器中,我已经可以看到该对象已在函数内部创建,即使实际调用在Value内部。这是因为调试器评估\u func本身,还是我不明白func是如何工作的 class Program { static void Main(string[] args) { var lazyObj = new LazyTest<Entity>(() => new Entity { Foo =

我想实现定制的
Lazy
类,就是为了实现它。有趣的是,当我将函数传递给构造函数时,在调试器中,我已经可以看到该对象已在函数内部创建,即使实际调用在
Value
内部。这是因为调试器评估
\u func
本身,还是我不明白
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;
    }
类程序
{
静态void Main(字符串[]参数)
{
var lazyObj=new LazyTest(()=>new Entity{Foo=5});//调试器显示实体已经在这里创建,Foo=5。
var entity=lazyObj.Value;//应该在这里创建实体。
Console.WriteLine(entity.Foo);
Console.Read();
}
}
公共类实体
{
公共int Foo{get;set;}
}
公共课懒散测验
{
私人T_值;
公共价值
{
得到
{
如果(_值==null)
_值=_func();
返回_值;
}
}
私有函数_Func{get;set;}
公共懒散测试(Func Func)
{
_func=func;
}

我发现,
Lazy
在内部使用属性
internal T ValueForDebugDisplay
,但我不能100%确定这是否是我问题的答案。

当您添加断点时,调试器会显示当前作用域中存在的变量和属性的值。默认情况下,调试器会对它们进行评估,您可以处理此行为在以下几个方面:

1) 将DebuggerBrowsable Never属性添加到属性中,则其值不会显示在“局部变量”窗口中:

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

2) 在Visual Studio中禁用此行为:工具->选项->调试->常规->然后禁用“启用属性评估…”

3) 。我们可以看到添加到类中的属性:

[DebuggerDisplay("ThreadSafetyMode={Mode}, IsValueCreated={IsValueCreated}, IsValueFaulted={IsValueFaulted}, Value={ValueForDebugDisplay}")]
public class Lazy<T>

如您所见,如果值尚未创建,它将显示惰性泛型类型的默认值。

但是我当前的实现是否实际创建了对象,或者调试器创建它是为了显示它?内存何时分配给对象?在调用
值之前或之后?调试器是cre将它显示在本地窗口中。当调试器遇到断点时会发生这种情况,我在上面添加了一些处理此问题的方法,祝您好运:)事实上,您是对的。我插入了一个
控制台。WriteLine
,查看它何时打印出来,结果是在调用
值或查看时打印出来在调试器中取消>值
internal T ValueForDebugDisplay
{
    get
    {
        if (!IsValueCreated)
        {
             return default(T);
        }
        return ((Boxed)m_boxed).m_value;
    }
}