DebuggerDisplay属性无法按预期工作

时间:2009-08-19 19:08:29

标签: visual-studio-2008 debugging debuggerdisplay

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

省略所有不相关的细节,源代码看起来非常普通:

[DebuggerDisplay("(Frozen) {m_children}")]
public IList<IEntityBase> Children
{
  get
  {
    if (m_children == null)
    {
      m_children = FetchChildrenFromDB(this);
    }
    return m_children;
  }
}

然而,当我在观察窗口中观看对象并展开this时,我在显示中看不到(冻结),这意味着调试器只是忽略该属性。

DebuggerDisplay image snapshot

根据Reflector的说法,该属性确实存在。我使用VS2008。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

如果您在观察窗口中看到以下内容:

[+]  ObjectName    | { namespace.object}

确保“工具 - >选项 - &gt;调试 - &gt;常规 - &gt;在变量窗口中显示对象的原始结构”不会被检查。

一旦我清除了这个,我的DebuggerDisplay属性就会正确显示(包括显示我添加的所有“WTF”和“Huh”......)

答案 1 :(得分:0)

好吧,我刚刚测试了它,它适用于我的简单程序。我还以为我有一个可能的解释,但测试显示它不是我想的(代码下面的信息)。

首先,这是有效的代码:

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; }
        }
    }
}

我认为您从FetchChildrenFromDB方法检索的集合类附加了自己的DebuggerDisplay属性,并且它具有优先权。但那不是它。我实现了一个附加了该属性的虚拟IList类,并且附加到该属性的属性仍然优先。

答案 2 :(得分:0)

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

BTW,什么是“冷冻”?它是简单的文本还是现有的属性? 编辑:这是我根据MSDN上的示例代码猜测的。拉斯的代码。

答案 3 :(得分:0)

您应该将DebuggerDisplayAttribute放在类而不是属性上,因为m_children是一个实例字段,无法在属性上下文中进行评估。

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