Jan*_*rlU 5 c# static class .net-core
在 .NET 中,我知道有一个垃圾收集器可以管理程序执行期间正在使用的内存。这意味着对象将在未使用时被清理。
我想知道是否可以在某个类中保留一个静态计数器,当该类的实例被创建或垃圾收集时自动更新。例如,如果我创建了某个CountableInstance类的一些实例,那么它们每个实例都可以根据它们的创建时间来InstanceIndex跟踪它们的当前位置。
这样的流程可能如下所示:
CountableInstance ctble0 是用 InstanceIndex == 0CountableInstance ctble1 是用 InstanceIndex == 1CountableInstance ctble2 是用 InstanceIndex == 2CountableInstance 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; }
}
Run Code Online (Sandbox Code Playgroud)
这会处理有多少个实例,并且还会为每个新对象分配正确的索引。然而,这个实现错过了实例被垃圾收集时应该发生的逻辑。
如果可能,我该如何实施?跟踪使用特定接口的对象实例是否也有效?
您可以按如下方式实现其要点,但这在 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);
}
Run Code Online (Sandbox Code Playgroud)