c# - 对同一对象的两个引用的不同属性值 (C#)

标签 c# debugging reference

我正试图在操作 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/

相关文章:

c - 当提示用户输入 CELSIUS 值时,为什么我的 CELSIUS 到 RANKINE 转换失败?

c# - 未设置对象引用 c#

java - 如何在静态方法中使用类作为参数

c# - 如何使用 epplus 遍历 excel 表中的行?

c# - 保持 140 个 TCP 连接?

c# - 在 Visual Studio 中 Hook 构建过程

c++ - 如何处理 C++ 中 Windows 8 Metro 应用程序的崩溃?

c++ - 我可以使用 Windows 事件日志来调试应用程序吗?

C#:使用 new 创建一个对象但不分配它。好主意/坏主意?

c# - .NET Core 项目依赖 "bleed"