選択したクラスのアクティブな (作成され、まだ破棄されていない) インスタンスの数を取得することは可能ですか?
例えば:
public class MyClass { }
...
var c1 = new MyClass();
var c2 = new MyClass();
count = GetActiveInstances(typeof(MyClass))
2 を返す必要があります。GC がこれらのクラスのいずれかを破棄すると、1 または 0 になります。
選択したクラスのアクティブな (作成され、まだ破棄されていない) インスタンスの数を取得することは可能ですか?
例えば:
public class MyClass { }
...
var c1 = new MyClass();
var c2 = new MyClass();
count = GetActiveInstances(typeof(MyClass))
2 を返す必要があります。GC がこれらのクラスのいずれかを破棄すると、1 または 0 になります。
プログラムでグローバル静的カウンターを保持できます。
これは単純なスレッド セーフなソリューションです。
class MyClass
{
static int counter = 0;
public MyClass()
{
Interlocked.Increment(ref counter);
}
~MyClass()
{
Interlocked.Decrement(ref counter);
}
}
次の同様の質問も見てください-クラスメソッド内のクラスタイプのオブジェクトの数を数えます
これ :
public class MyClass
{
private static int instances = 0;
public MyClass()
{
instances++;
}
~MyClass()
{
instances--;
}
public static int GetActiveInstances()
{
return instances;
}
}
使用する :
MyClass c1 = new MyClass();
MyClass c2 = new MyClass();
int count = MyClass.GetActiveInstances();
コンストラクター (インクリメント) とファイナライザー (デクリメント) 内にカウント メカニズムを実装する場合のみ。しかし、それでも実際には非アクティブ (誰も参照していない) であるが、まだ収集されていないインスタンスは考慮されません。
さらに、ファイナライザーをクラスに追加すると、どんなに些細なことでもパフォーマンスに悪影響を及ぼします。これは、そうすることに対する議論です。
これを試してください:
public class MyClass
{
public static int activeCount = 0;
public MyClass() => activeCount++;
~MyClass() => activeCount--;
}
//In the main
var testClass1 = new MyClass();
var testClass2 = new MyClass();
Console.WriteLine(MyClass.activeCount);
public class MyClass
{
private static int count;
private static object _lock = new object();
public MyClass()
{
lock(_lock)
{
count++;
}
}
private ~MyClass()
{
lock(_lock)
{
count--;
}
}
}
public class MyClass
{
public static int countinstance =0;
MyClass(){ countinstance ++;}
~ MyClass() {countinstance --; }
}
countinstance によってインスタンスをアクティブにするシンプルで簡単な取得
組み込みのメカニズムはわかりませんが、コンストラクターでプライベート静的変数をいつでも増やすことができます。
public class MyClass
{
private static int instances = 0;
public MyClass() => instances++;
~MyClass() => instances--;
}
試したことはありませんが、動作するはずです。
そのようなことは不可能ですが、次のようなことができます
注: ClassInstance
カウントを維持するためだけに int 値にすることもできます。
public class MyType
{
public static List<MyType> ClassInstance = new List<MyType>();
public MyType() => ClassInstance.Add(this);
public RemoveClass(MyType t)
{
ClassInstance.Remove(t);
t = null;
}
public int ActiveCount => ClassInstance.Count;
}
クラスでカウントの静的変数を作成し、それをインクリメントしてconstructor
デクリメントすることで試すことができdestructor
ます。