2010-10-08 35 views
8

Một đồng nghiệp của tôi tuyên bố rằng trong C# có các thành viên tĩnh trong các lớp không tĩnh ngăn cản các cá thể của các lớp đó khỏi bị thu gom rác và đây là một nguồn phổ biến của C# rò rỉ bộ nhớ. Kết quả là anh ta luôn bao bọc các thành viên tĩnh trong một lớp tĩnh và truy cập chúng từ đó thông qua một thuộc tính hoặc phương thức tĩnh (s) trên lớp tĩnh đó. Tôi luôn nghĩ rằng các số liệu thống kê nằm trên ngăn xếp, không phải đống và do đó không có gì liên quan đến việc thu gom rác thải. Nó có vẻ không đúng với tôi.Một câu hỏi về các thành viên tĩnh bên trong các lớp không tĩnh và thu gom rác

Sự thật về điều này là gì?

Trả lời

11

Anh ấy không biết mình đang nói về điều gì. Các thành viên tĩnh bên trong một lớp không tĩnh làm không phải ngăn các thể hiện của lớp khỏi bị thu gom rác.

Điều đó nói rằng, thống kê có thể nằm trên chồng hoặc đống. Nó không quan trọng cho việc thu gom rác thải. Điều gì là vấn đề là các phần tĩnh của một loại không được lưu trữ với các trường hợp của loại.

0

Bạn của bạn không chính xác.

Ý tưởng về phương pháp tĩnh là KHÔNG có cá thể nào của lớp đó. Vì vậy, không có gì tồn tại để thu gom rác thải.

Thử đặt this bên trong phương thức tĩnh trong lớp không tĩnh và xem điều gì xảy ra.

5

Thành viên tĩnh là nguồn gốc của GC. Bất cứ điều gì được tham chiếu từ một tĩnh sẽ được giữ sống. Cho dù tham chiếu tĩnh là trong một lớp tĩnh hoặc trong một lớp không tĩnh là không liên quan.

Nếu bạn có lớp không tĩnh có trường tĩnh và bạn có trường hợp của lớp đó, trường tĩnh không có nhiều phiên bản - đó là một phần của định nghĩa tĩnh - không phải là trường cho mỗi trường . Vì vậy, cho dù các lớp học chính nó là tĩnh hay không làm cho không có sự khác biệt.

Vì vậy, có, tham chiếu tĩnh thường là nguyên nhân gây rò rỉ bộ nhớ, đặc biệt là các sự kiện tĩnh mà bạn chưa hủy đăng ký khi thích hợp. Việc thay đổi lớp là tĩnh sẽ không giải quyết được sự rò rỉ bộ nhớ của bạn - bạn cần phải loại bỏ tham chiếu tĩnh khi thời gian tồn tại của cá thể mà nó đang nhắc đến là xong. Thường thì điều này được thực hiện thông qua Dispose() ing đối tượng và có Dispose dọn dẹp đăng ký tham chiếu/sự kiện.

This là một nơi tốt để tìm hiểu thêm về cách thức hoạt động của GC, cách thức hoạt động của GC và cách thức hoạt động của nó. Cũng như Finalisers và nhiều hơn nữa ...

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