2012-09-05 20 views
10

Duplicar posibles:
how can i find out how many objects are created of a class in C#casos Conde de la clase

¿Es posible obtener el número de casos en los cuales es activa (creado y aún no destruido) para la clase seleccionada?

Por ejemplo

public class MyClass 
{ 
} 

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

    count = GetActiveInstances(typeof(MyClass)) 

debe devolver 2. Si GC destruir cualquiera de estas clases luego 1 o 0.

+0

definen "activa", ¿qué quiere decir por destruida . – Jodrell

+3

personas aburridas declararían una variable estática int aumentando en la construcción y disminuyendo en la eliminación. – Najzero

+0

me parece una pregunta duplicada y tantas respuestas duplicadas. – Jodrell

Respuesta

18

Puede contener contador estático global en su programa.
Esta es una solución segura hilo simple:

class MyClass 
{ 
    static int counter = 0; 

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

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

también echar un vistazo a la siguiente pregunta similar - Count number of objects of class type within class method

+2

+1 para el uso de 'lock' –

+0

@YannickBlondeau:' lock' debería * siempre * apuntar a un campo 'private'. Si vas a hacerlo, hazlo bien. – Jon

+6

No. Nunca coloque un candado en un finalizador. No desea el bloqueo del hilo del finalizador por ningún motivo. Use 'Interlocked.Increment' y' Interlocked.Decrement' si debe hacer algo como esto desde un finalizador. –

4

Sólo si se implementa un mecanismo de conteo dentro del constructor (incremento) y el finalizador (decremento) Pero incluso eso no dará cuenta de las instancias que están realmente inactivas (nadie tiene ninguna referencia a ellas) pero aún no se han recopilado.

Además, agregar un finalizador a una clase, no importa cuán trivial sea - will adversely affect performance, que es un argumento en contra de hacerlo.

2
public class MyClass{ 
    static int count; 
    static object _lock = new object(); 
    public MyClass(){ 
     lock(_lock){ 
      count++; 
     } 
    } 
    ~MyClass(){ 
     lock(_lock){ 
      count--; 
     } 
    } 

} 
+0

'protected void finalize()'? – Jon

+1

Esta es una pregunta de C#, no de Java. –

+0

ver también http://stackoverflow.com/questions/934619/c-sharp-multi-threaded-unsigned-increment –

1

No sé de un sistema incorporado en el mecanismo, pero siempre se puede incrusta una variable estática privada en el constructor.

public class MyClass 
{ 
    static int instances = 0; 
    public MyClass(){ 
     instances++; 
    } 
    ~MyClass(){ 
     instances--; 
    } 
} 

No lo he intentado pero debería funcionar.

0

Puede intentarlo haciendo una variable estática para contar en clase e incrementarla en constructor y decrementar en destructor. Esto le ayuda.

1

Prueba con esto:

public class MyClass 
{ 
    public static int activeCount = 0; 

    public MyClass() 
    { 
     activeCount++; 
    } 

    ~MyClass() 
    { 
     activeCount--; 
    } 
} 


//In the main 
MyClass testClass1 = new MyClass(); 
MyClass testClass2 = new MyClass(); 

Console.WriteLine(MyClass.activeCount); 
1

tal cosa no es posible, sino que puede hacer soemthing como

Nota: classinstance puede ser también int valor sólo para mantener el recuento.

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 
    { 
    get { classinstance.Count; } 
    } 
} 
1
public class MyClass 
    { 
public static int countinstance =0; 
MyClass(){ countinstance ++;} 
~ MyClass() {countinstance --; } 
    } 

simple y fácil de conseguir instancia activa por countinstance

4

esto:

public class MyClass 
{ 
    private static int instances = 0; 

    public MyClass() 
    { 
     instances++; 
    } 

    ~MyClass() 
    { 
     instances--; 
    } 


    public static int GetActiveInstances() 
    { 
     return instances; 
    } 

} 

uso:

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

    int count = MyClass.GetActiveInstances();