【问题标题】:How do I iterate through instances of a class in C#?如何在 C# 中遍历类的实例?
【发布时间】:2010-12-19 15:43:51
【问题描述】:

有没有办法在 C# 中迭代​​类的实例?这些实例不在集合中进行跟踪或管理。

【问题讨论】:

  • Marc 是对的,您不能在框架内执行此操作 - 我认为有人想要执行此操作的次数必须非常低 - 您是否正在尝试实现特定的目标?
  • 没什么特别的。只是打开的表单可以使用两个名称之一(基于表单的某些特征)。也许那是不必要的,我会坚持使用一个表单名称。
  • 如果您试图确保表单只打开一次 - 也许您可以使用互斥锁。您可以随意命名表单,然后检查是否已创建互斥锁。
  • 这是用于 WinForms 的吗?如果是这样,Application.OpenForms 可能有用。

标签: c# .net iteration iterator


【解决方案1】:

不在常规框架内。您将需要手动跟踪它们。

但是,您可以在 windbg/sos 中执行此操作 - 主要用于调试目的(而不是例程代码)。

【讨论】:

【解决方案2】:

您必须在某处引用它们,或者至少知道在哪里查找,因此在识别它们时,您可能会将它们放入一个集合中,然后进行迭代。

如果您不知道引用的位置,那么您必须引入某种跟踪机制。也许是类型上的静态集合?但必须小心执行。

【讨论】:

    【解决方案3】:

    不直接。

    从概念上讲,您可以让您的对象将其自身的副本放置到某个众所周知的位置(例如静态集合),然后使用它进行迭代,但是您必须确保从该集合中清除该实例在某些时候,否则它永远不会被垃圾收集。

    【讨论】:

    • 或许在集合中使用WeakReference;但无论哪种方式,我认为这违背了“这些实例不在集合中跟踪或管理”。在问题中。
    【解决方案4】:

    在评论线程on this post 中有一个与此问题相关的有趣讨论和解决方案。

    【讨论】:

      【解决方案5】:

      正如 Marc 所说,如果您想在代码中执行此操作,则需要保留它们的集合。如果您正在调试,请查看这篇博文:http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx

      如果您需要在内存中收集某个类型的所有对象实例的集合,您可以考虑使用 System.WeakRef 的集合。弱 ref 是一个不保留它所引用的对象的引用。这将使您可以保留要枚举的对象实例的弱引用集合。请查看帮助中的 Weakrefs 以获取更多信息。

      【讨论】:

        猜你喜欢
        • 2018-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 2021-11-25
        • 2020-11-21
        • 1970-01-01
        相关资源
        最近更新 更多