Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 DebuggerDisplay属性未按预期工作_Visual Studio 2008_Debugging_Debuggerdisplay - Fatal编程技术网

Visual studio 2008 DebuggerDisplay属性未按预期工作

Visual studio 2008 DebuggerDisplay属性未按预期工作,visual-studio-2008,debugging,debuggerdisplay,Visual Studio 2008,Debugging,Debuggerdisplay,我知道这个属性应该在C#中起作用,但在我的例子中它不起作用。 我有一个班级,有一个懒惰的孩子。访问此属性可能会产生往返服务器的副作用。因此,很自然,我不希望在调试器监视窗口中监视时发生这种情况 忽略所有不相关的细节,源代码看起来很普通: [DebuggerDisplay("(Frozen) {m_children}")] public IList<IEntityBase> Children { get { if (m_children == null) {

我知道这个属性应该在C#中起作用,但在我的例子中它不起作用。 我有一个班级,有一个懒惰的孩子。访问此属性可能会产生往返服务器的副作用。因此,很自然,我不希望在调试器监视窗口中监视时发生这种情况

忽略所有不相关的细节,源代码看起来很普通:

[DebuggerDisplay("(Frozen) {m_children}")]
public IList<IEntityBase> Children
{
  get
  {
    if (m_children == null)
    {
      m_children = FetchChildrenFromDB(this);
    }
    return m_children;
  }
}
[DebuggerDisplay(“(冻结){m_children}”)]
公营儿童
{
得到
{
if(m_children==null)
{
m_children=FetchChildrenFromDB(this);
}
返回m_儿童;
}
}
然而,当我观察对象并在观察窗口中展开
this
时,我在显示中看不到(冻结),这意味着调试器只是忽略该属性

根据Reflector,属性确实存在。我使用VS2008


有什么想法吗?

嗯,我刚刚测试了它,它与我的简单程序配合使用。我还认为我有一个可能的解释,但测试表明这不是我所想的(代码下面的信息)

首先,下面是有效的代码:

using System;
using System.Diagnostics;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            Console.Out.WriteLine(p.Name); // breakpoint here
        }

        private String _Name = String.Empty;
        [DebuggerDisplay("Name: {_Name}")]
        public String Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        private IList<String> _Names = new List<String>();
        [DebuggerDisplay("Names: {_Names.Count}")]
        public IList<String> Names
        {
            get { return _Names; }
            set { _Names = value; }
        }
    }
}
使用系统;
使用系统诊断;
使用System.Collections.Generic;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
程序p=新程序();
Console.Out.WriteLine(p.Name);//此处为断点
}
私有字符串_Name=String.Empty;
[调试程序显示(“名称:{u Name}”)]
公共字符串名
{
获取{return\u Name;}
设置{u Name=value;}
}
私有IList_name=新列表();
[调试程序显示(“名称:{u Names.Count}”)]
公营机构名称
{
获取{return\u Names;}
设置{u name=value;}
}
}
}

我的想法是,您从FetchChildrenFromDB方法检索的集合类有其自己的DebuggerDisplay属性,并且它具有优先级。但事实并非如此。我实现了一个附加了该属性的虚拟IList类,而附加到该属性的类仍然具有优先权。

我认为,这可能是由于括号“(冻结)”造成的。
如果是文本,则将其更改为“冻结”

顺便说一句,什么是“冻结”?它是简单文本还是现有属性?

编辑:这是我根据MSDN&Lasse代码中的示例代码猜测的。

如果您在手表窗口中看到以下内容:

[+]  ObjectName    | { namespace.object}
确保未选中“工具->选项->调试->常规->显示变量窗口中对象的原始结构”

清除此选项后,我的DebuggerDisplay属性将正确显示(包括显示我添加的所有“WTF”和“Huh”…)

您应该将属性放在类上,而不是属性上,因为
m_children
是一个实例字段,不能在属性上下文中进行计算


属性显示始终按原样计算,因为它没有调试器代理。

您是否检查过是否无意中引入了自己的DebuggerDisplay属性,可能是因为某些调试问题?如果这是某些ORM实现的一部分,是不是ORM框架在实际对象周围创建了一个垫片层,以实现可观察的属性?我见过这些事情发生,在这种情况下,对象的类型与您的源代码不匹配。您能检查一下源代码中的确切类型吗?该代码是客户端代码。在那一边没有使用ORM。我们确实在服务器端使用NHibernate,但客户端与它完全分离。我确信它不是一个垫片。我知道DebuggerDisplay应该可以工作。这就是为什么我感到困惑。它显然不适用于我的懒惰属性。冻结只是一个让我知道该属性有效的词。你可以用任何其他的词替换它,省略括号,随便什么。没什么帮助。