2010-04-22 12 views
6

Tôi đã cân nhắc tại sao chúng tôi khuyên nên không phát hành tài nguyên được quản lý bên trong hoàn thiện. Nếu bạn thấy ví dụ mã số tại http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx và tìm kiếm chuỗi "Vứt bỏ (bool disposing) thực hiện trong hai trường hợp riêng biệt" và đọc nhận xét đó, bạn sẽ hiểu ý tôi.Tại sao "Phương pháp hoàn thiện không nên tham chiếu đến bất kỳ đối tượng nào khác"?

Chỉ có khả năng tôi có thể nghĩ là nó có thể có một cái gì đó để làm với thực tế là nó không thể dự đoán khi finalizer sẽ được gọi. Có ai biết câu trả lời đúng không?

cảm ơn, Mishal

Trả lời

11

Nếu bạn đang tham khảo một đối tượng từ finalizer, bạn không biết nếu rằng đối tượng đã được hoàn tất - và làm thế nào nó sẽ hoạt động nếu nó hoàn thành. (Tôi không biết liệu bất kỳ CLR hiện chạy nhiều luồng finalizer, nhưng một khả năng đáng sợ là nó trong quá trình được hoàn thiện khi finalizer của bạn chạy.)

Tất cả các bạn nên cần phải làm trong một finalizer là phát hành không được quản lý tài nguyên mà bạn sở hữu trực tiếp. Nếu bạn đang tham khảo các loại được quản lý khác sở hữu tài nguyên, hãy để chúng thực hiện công việc của mình trong final final của họ là.

+0

Nhưng nếu đối tượng của tôi (hiện đang được hoàn thành) đang giữ một tham chiếu đến đối tượng được quản lý khác, tôi nghĩ CLR đảm bảo rằng đối tượng được tham chiếu vẫn còn hoạt động ở giai đoạn này. (im chỉ đoán bởi khái niệm thu gom rác, đó là đối tượng asan dài được tham chiếu nó sẽ không bị xóa) – mishal153

+0

Nhưng nếu đối tượng của tôi (hiện đang được hoàn thành) đang giữ một tham chiếu đến đối tượng được quản lý khác, tôi nghĩ CLR đảm bảo rằng đối tượng được tham chiếu vẫn còn hoạt động ở giai đoạn này. (im chỉ đoán bởi các khái niệm về bộ sưu tập rác, đó là đối tượng asan dài được tham chiếu nó sẽ không được làm sạch). Vì vậy, nó sẽ là một lỗi CLR tôi nghĩ rằng nếu đối tượng tham chiếu đã được hoàn thành trước khi đối tượng cha mẹ được hoàn thành. – mishal153

+5

Miễn là một đối tượng là * có thể truy cập *, nó sẽ không bị xóa. Nếu đối tượng của bạn đang được hoàn thiện, thì nó không thể truy cập được, và bất kỳ tham chiếu nào mà nó đang nắm giữ không phải là (và do đó không được tính). – cHao

2

Tôi nghĩ bạn đã đánh trúng phần móng trên đầu. Nếu bạn nhìn vào từ ngữ trong tài liệu Object.Finalize, nó nói: See the IDisposable interface for a complementary and more controllable means of disposing resources. "Bổ sung" có nghĩa là "một cách khác để làm điều đó" và kiểm soát được ... chính xác những gì bạn nói.

Chỉnh sửa: Và những gì Jon Skeet đã nói. Khái niệm của nhiều chủ đề finalizer đã đảm bảo tôi sẽ không được ngủ, hoặc có những giấc mơ rất xấu đêm nay.