4

我知道这个属性应该在 C# 中工作,但在我的情况下它没有。我有一个懒惰的属性儿童类。访问此属性可能会产生往返服务器的副作用。所以,很自然地,我不希望这种情况发生在我只是在调试器观察窗口中观察时。

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

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

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

调试器显示图像快照

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

有任何想法吗?

4

4 回答 4

5

如果您在监视窗口中看到类似于以下内容的内容:

[+]  ObjectName    | { namespace.object}

确保未选中“工具->选项->调试->常规->在变量窗口中显示对象的原始结构” 。

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

于 2010-03-16T07:42:25.140 回答
1

好吧,我刚刚对其进行了测试,它适用于我的简单程序。我也认为我有一个可能的解释,但测试表明这不是我的想法(代码下方的信息)。

首先,这是有效的代码:

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 类,并且附加到该属性的那个仍然具有优先权。

于 2009-08-19T19:39:11.297 回答
0

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

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

于 2010-03-16T07:54:40.133 回答
0

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

顺便说一句,什么是“冰雪奇缘”?它是简单的文本还是现有的属性?
编辑:这是我根据 MSDN & Lasse's code 上的示例代码猜测的。

于 2009-08-19T19:43:31.473 回答