本当に単純な質問ですが、答えが見つからないようです。
特定のクラスから使用されているオブジェクトの数をカウントするにはどうすればよいですか? リストを使用してすべてのオブジェクトをリストに追加し、リストを数えることを考えていました...そうするとしたら、そのリストにどのようにアクセスしますか?
本当に単純な質問ですが、答えが見つからないようです。
特定のクラスから使用されているオブジェクトの数をカウントするにはどうすればよいですか? リストを使用してすべてのオブジェクトをリストに追加し、リストを数えることを考えていました...そうするとしたら、そのリストにどのようにアクセスしますか?
作成されたクラスのインスタンスの数に関心がある場合は、そのコンストラクターで静的カウンターをインクリメントできます。
public class C
{
private static int numInstances;
public C() {
++numInstances;
// and whatever else is needed
}
}
このコードはスレッド セーフではないことに注意してください。C.numInstances へのアクセスにスレッド セーフ保護を追加する必要があります。
これを行うには、基本的に 2 つの方法があります。
コンストラクタでインクリメントされ、デストラクタでデクリメントされるクラス内の静的カウントを保持します (およびDispose
を使用する場合はIDisposable
)。これの欠点は、オブジェクトがファイナライズ キューに移動するため (を使用しない場合Dispose
)、オブジェクトのガベージ コレクションが遅れることです。
インスタンスへの弱参照の静的リストを保持します。this
コンストラクターのリストに追加します。リストを列挙するとき、またはその要素をカウントするときは、そのオブジェクトを実際にカウントするために弱参照がまだ生きていることを確認してください。また、この時点でリストを圧縮したい場合、つまり無効な弱参照を削除したい場合があります。を見ることもできますがConditionalWeakTable<TKey, TValue>
、残念ながら、単純なカウントは提供されません。
また、複数のスレッドがオブジェクトを作成する可能性がある場合は、これらの要素へのアクセスを同期することを検討してください。