我正试图在操作 FlowDocument
的应用程序中追踪一个非常难以捉摸的错误。我在下面展示了三行连续的调试代码,以及它们的输出:
Debug.Assert(ReferenceEquals(document1, document2));
Debug.WriteLine(document1.Blocks.Count); // 1
Debug.WriteLine(document2.Blocks.Count); // 3
任何人都可以帮助我理解对同一对象的两个引用如何对给定属性具有不同的值吗?还是我遗漏了一些有关 ReferenceEquals
工作方式的信息?
谢谢,
蒂姆
编辑:
如果我将断言更改为 if
block ,调试代码将永远不会运行 ...
if (ReferenceEquals(document1, document2))
{
Debug.WriteLine(document1.Blocks.Count);
Debug.WriteLine(document2.Blocks.Count);
}
...这让我觉得自己非常愚蠢,因为 ReferenceEquals
测试显然有效,但我不明白为什么断言无效。
最佳答案
我脑海中浮现的两件事:
- 访问 Blocks 或 Blocks.Count 可能会改变状态(不应该,但有可能)。
- 对象可能会在两次调用之间的另一个线程上更改。你在应用程序中使用多线程吗?
此外,如果引用属于不同类型(即 document2 属于继承类型),则该属性可能会被重载以返回不同的内容。您可以检查是否 document1.GetType() == document2.GetType()
。
根据您的更新进行编辑
Debug.Assert 只有在程序集在 Debug模式下编译时才会运行。如果您正在运行 Release,它将不会运行。这是因为 Debug.Assert用 [Conditional("DEBUG")]
属性装饰。
看来问题是您确实有 2 个不同的对象。
关于c# - 对同一对象的两个引用的不同属性值 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3326032/