gpt4 book ai didi

c# - 是否可以跟踪类的当前实例数?

转载 作者:行者123 更新时间:2023-12-03 15:48:00 24 4
gpt4 key购买 nike

在.NET 中,我知道有一个垃圾收集器可以管理程序执行期间正在使用的内存。这意味着对象将在未使用时被清理。
我想知道是否可以在某个类中保留一个静态计数器,当该类的实例被创建或垃圾收集时自动更新。例如,如果我创建一些 CountableInstance 的一些实例类,那么他们每个人都可以有一个 InstanceIndex根据创建时间跟踪它们的当前位置。
这样的流程可能如下所示:

  • 程序开始
  • CountableInstance ctble0使用 InstanceIndex == 0 创建
  • CountableInstance ctble1使用 InstanceIndex == 1 创建
  • CountableInstance ctble2使用 InstanceIndex == 2 创建
  • CountableInstance ctble1未使用并收集垃圾
  • ctble0的索引保持不变
  • ctble2的索引变为 1
  • 程序结束

  • 我猜要跟踪 CountableInstance 的数量实例如下所示:
    public class CountableInstance
    {
    public static int total = 0;
    public CountableInstance()
    {
    InstanceIndex = total;
    total++; // Next instance will have an increased InstanceIndex
    }
    public CountableInstance(...) : this()
    {
    // Constructor logic goes here
    }

    public int InstanceIndex { get; private set; }
    }
    这会处理有多少实例,并且还会为每个新对象分配正确的索引。然而,这个实现错过了当实例被垃圾收集时应该发生的逻辑。
    如果可能,我该如何实现?跟踪使用特定接口(interface)的对象的实例是否也有效?

    最佳答案

    您可以实现以下要点,但这似乎是 IMO 的一个坏主意;尤其:

  • 终结器不是免费的(IDisposable.Dispose() 也不是)
  • 你可以在不运行构造函数的情况下创建对象(如果你足够努力的话)

  • 无论如何,代码:
    public class CountableInstance
    {
    static int s_Total, s_Alive;
    public CountableInstance() {
    // need a separate total vs alive so we don't give duplicate
    // InstanceIndex, at least for the first 4 billion objects
    InstanceIndex = Interlocked.Increment(ref s_Total);
    Interlocked.Increment(ref s_Alive);
    }
    ~CountableInstance() {
    Interlocked.Decrement(ref s_Alive);
    }
    public int InstanceIndex { get; }
    public static int Alive => Volatile.Read(ref s_Alive);
    public static int Total => Volatile.Read(ref s_Total);
    }

    关于c# - 是否可以跟踪类的当前实例数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64352330/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com