DebuggerDisplay属性无法按预期工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DebuggerDisplay属性无法按预期工作相关的知识,希望对你有一定的参考价值。
我知道这个属性应该在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。
有任何想法吗?
如果您在观察窗口中看到以下内容:
[+] ObjectName | { namespace.object}
确保未选中“工具 - >选项 - >调试 - >常规 - >显示变量窗口中对象的原始结构”。
一旦我清除了这一点,我的DebuggerDisplay属性就会正确显示(包括显示所有“WTF”和“Huh”我添加的......)
好吧,我刚测试了它,它适用于我的简单程序。我还以为我有一个可能的解释,但测试显示它不是我想的(代码下面的信息)。
首先,这是有效的代码:
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类,并且附加到该属性的类仍然优先。
我想,这可能是由于括号“(冻结)”。 将其更改为“冻结”,如果是文本。
顺便说一句,什么是“冻结”?它是简单的文本还是现有的属性? 编辑:这是我根据MSDN和Lasse代码上的示例代码猜测的。
您应该将DebuggerDisplayAttribute放在类而不是属性上,因为m_children
是一个实例字段,无法在属性上下文中进行求值。
始终按原样评估属性显示,因为没有调试器代理。
以上是关于DebuggerDisplay属性无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
双向链表 std::unique_ptr 类在节点删除时无法按预期工作
SaveFileDialog AddExtension 无法按预期工作