2012-09-05 46 views
10

可能重複:
how can i find out how many objects are created of a class in C#計數實例

是否有可能得到它是積極的(創建,尚未銷燬)選定類實例的數量?

例如

public class MyClass 
{ 
} 

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

    count = GetActiveInstances(typeof(MyClass)) 

應該返回2.如果GC破壞任何這些類的則1或0

+0

界定 「活躍」,你是什麼摧毀意思。 – Jodrell

+3

無聊的人會聲明一個靜態的int變量增加建設和減少刪除。 – Najzero

+0

對我來說看起來像一個重複的問題,以及許多重複的答案。 – Jodrell

回答

18

您可以在程序中保存全局靜態計數器。
這是一個簡單的線程安全的解決方案:

class MyClass 
{ 
    static int counter = 0; 

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

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

也看看下面類似的問題 - Count number of objects of class type within class method

+2

+1使用'lock' –

+0

@YannickBlondeau:'lock'應該總是*定位一個'private'字段。如果你打算這樣做,那就做對吧。 – Jon

+6

不可以。永遠不要在終結者上鎖。您不希望終結線程因任何原因而被阻塞。使用'Interlocked.Increment'和'Interlocked.Decrement',如果你必須從終結者那裏做這樣的事情。 –

4

只有當你實現構造函數(增量)和釋放內部計數機制(減量)。但即便如此,也不能解釋真正無效的情況(沒有人提及它們),但尚未收集。

此外,添加終結器到類 - 無論多麼微不足道 - will adversely affect performance,這是一個反對這樣做的論點。

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

這是一個C#問題,而不是Java。 –

+0

另請參閱http://stackoverflow.com/questions/934619/c-sharp-multi-threaded-unsigned-increment –

1

我不知道一個內置的機制,但你總能在構造函數中包含一個私有靜態變量。

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

沒有試過,但應該工作。

0

你可以通過在課堂中爲count計算一個靜態變量並在constructor中增加它並在destructor中遞減來嘗試它。可以幫助你。

1

試試這個:

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

這樣的事情是不可能的,但你可以做soemthing像

注: Children子可也僅僅能維持數int值。

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 --; } 
    } 

簡單,易於通過countinstance

4

獲得實例活躍的:

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();