2010-03-06 74 views

Trả lời

13

Bạn sẽ phải đặt một bộ đếm tĩnh được tăng lên xây dựng:

public class Foo 
{ 
    private static long instanceCount; 

    public Foo() 
    { 
     // Increment in atomic and thread-safe manner 
     Interlocked.Increment(ref instanceCount); 
    } 
} 

một vài lưu ý:

  • này không đếm số hiện trong bộ nhớ trường - đó sẽ bao gồm có một finalizer để decr ement quầy; Tôi sẽ không đề nghị rằng
  • Điều này sẽ không bao gồm các trường hợp được tạo thông qua một số cơ chế như serialization có thể bỏ qua một nhà xây dựng
  • Rõ ràng điều này chỉ hoạt động nếu bạn có thể sửa đổi lớp học; bạn không thể tìm ra số lượng ví dụ của System.String được tạo, ví dụ - ít nhất là không phải tham gia vào API gỡ lỗi/lược tả

Tại sao bạn muốn thông tin này, không quan tâm?

+1

Làm thế nào về 'Interlocked.Decrement (ref instanceCount)' trong destructor của đối tượng? Sau đó 'instanceCount' sẽ đưa ra ước tính về các cá thể đối tượng đang sống. – user

+0

Đồng ý, sẽ hữu ích khi giảm dần bên trong trình phá hủy để hoàn tất. '~ Foo() {Interlocked.Decrement (ref instanceCount); } '@ JonSkeet, tại sao bạn không khuyên bạn nên (không quan tâm)? – defines

+0

@defines: Bởi vì đó là việc đếm một cái gì đó khác nhau - đó là đếm bao nhiêu đối tượng chưa được hoàn thành. OP đã yêu cầu số lượng đối tượng đã được tạo. Nếu tôi tạo 100 và tất cả chúng được hoàn thành/GC'd, tôi vẫn tạo 100 đối tượng. –

1

Đây có phải là lớp học mà bạn đã thiết kế không?

Nếu có, hãy thêm bộ đếm vào lớp được tăng lên trong hàm tạo và được giảm dần trong Vứt bỏ.

Có khả năng bạn có thể đặt bộ đếm hiệu suất này để bạn có thể theo dõi nó trong Trình giám sát hiệu suất.

Các vấn đề liên quan