我知道这个属性应该在C#中工作,但在我的情况下却没有。 我有一个懒惰的孩子班级。访问此属性可能会产生向服务器往返的副作用。因此,当我在调试器监视窗口中观察它时,我自然不希望发生这种情况。
省略所有不相关的细节,源代码看起来非常普通:
[DebuggerDisplay("(Frozen) {m_children}")]
public IList<IEntityBase> Children
{
get
{
if (m_children == null)
{
m_children = FetchChildrenFromDB(this);
}
return m_children;
}
}
然而,当我在观察窗口中观看对象并展开this
时,我在显示中看不到(冻结),这意味着调试器只是忽略该属性。
有什么想法吗?
答案 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
是一个实例字段,无法在属性上下文中进行评估。
属性显示始终按原样评估,因为没有调试器代理。