16

重複の可能性:
C# で作成されたクラスのオブジェクトの数を確認するにはどうすればよいですか?

選択したクラスのアクティブな (作成され、まだ破棄されていない) インスタンスの数を取得することは可能ですか?

例えば:

public class MyClass { }

...

var c1 = new MyClass();
var c2 = new MyClass();

count = GetActiveInstances(typeof(MyClass))

2 を返す必要があります。GC がこれらのクラスのいずれかを破棄すると、1 または 0 になります。

4

9 に答える 9

29

プログラムでグローバル静的カウンターを保持できます。
これは単純なスレッド セーフなソリューションです。

class MyClass
{
    static int counter = 0;

    public MyClass()
    {
        Interlocked.Increment(ref counter);
    }

    ~MyClass()
    {
        Interlocked.Decrement(ref counter);
    }
}

次の同様の質問も見てください-クラスメソッド内のクラスタイプのオブジェクトの数を数えます

于 2012-09-05T07:40:21.243 に答える
7

これ :

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();
于 2012-09-05T07:46:45.573 に答える
4

コンストラクター (インクリメント) とファイナライザー (デクリメント) 内にカウント メカニズムを実装する場合のみ。しかし、それでも実際には非アクティブ (誰も参照していない) であるが、まだ収集されていないインスタンスは考慮されません。

さらに、ファイナライザーをクラスに追加すると、どんなに些細なことでもパフォーマンスに悪影響を及ぼします。これは、そうすることに対する議論です。

于 2012-09-05T07:39:47.633 に答える
2

これを試してください:

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);
于 2012-09-05T07:42:41.380 に答える
1
public class MyClass
{
    private static int count;
    private static object _lock = new object();

    public MyClass()
    {
         lock(_lock)
         {
             count++;
         }
     }

    private ~MyClass()
    {
        lock(_lock)
        {
             count--;
        }
    }
}
于 2012-09-05T07:40:32.053 に答える
1
 public class MyClass
    {
public  static int countinstance  =0;
MyClass(){ countinstance  ++;}
 ~ MyClass() {countinstance  --; }
    }

countinstance によってインスタンスをアクティブにするシンプルで簡単な取得

于 2012-09-05T07:44:13.743 に答える
0

組み込みのメカニズムはわかりませんが、コンストラクターでプライベート静的変数をいつでも増やすことができます。

public class MyClass
{
    private static int instances = 0;

    public MyClass() => instances++;
    ~MyClass() => instances--;
}

試したことはありませんが、動作するはずです。

于 2012-09-05T07:40:42.670 に答える
0

そのようなことは不可能ですが、次のようなことができます

注: 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;
}
于 2012-09-05T07:43:10.437 に答える
-1

クラスでカウントの静的変数を作成し、それをインクリメントしてconstructorデクリメントすることで試すことができdestructorます。

于 2012-09-05T07:41:40.030 に答える