Ví dụ:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Khi nào tôi nên tự tạo một hàm hủy? Khi nào bạn cần tạo một hàm hủy?
Ví dụ:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Khi nào tôi nên tự tạo một hàm hủy? Khi nào bạn cần tạo một hàm hủy?
Câu trả lời:
CẬP NHẬT: Câu hỏi này là chủ đề của blog của tôi vào tháng 5 năm 2015 . Cảm ơn vì câu hỏi tuyệt vời của bạn! Xem blog để biết danh sách dài những sai lầm mà mọi người thường tin về quyết toán.
Khi nào tôi nên tự tạo một hàm hủy?
Hầu như không bao giờ.
Thông thường, người ta chỉ tạo ra một hàm hủy khi lớp của bạn đang giữ một số tài nguyên không được quản lý đắt tiền phải được dọn sạch khi đối tượng biến mất. Tốt hơn là sử dụng mẫu dùng một lần để đảm bảo rằng tài nguyên được dọn sạch. Một hàm hủy sau đó về cơ bản là một sự đảm bảo rằng nếu người tiêu dùng đối tượng của bạn quên xử lý nó, tài nguyên cuối cùng vẫn được dọn sạch. (Có lẽ.)
Nếu bạn tạo một hàm hủy thì cực kỳ cẩn thận và hiểu cách thức hoạt động của trình thu gom rác . Kẻ hủy diệt thực sự kỳ lạ :
Hầu như không có gì là bình thường đúng là đúng trong một hàm hủy. Hãy thực sự, thực sự cẩn thận. Viết một hàm hủy chính xác là rất khó.
Khi nào bạn cần tạo một hàm hủy?
Khi kiểm tra một phần của trình biên dịch xử lý các hàm hủy. Tôi chưa bao giờ cần phải làm như vậy trong mã sản xuất. Tôi hiếm khi viết các đối tượng thao túng tài nguyên không được quản lý.
Nó được gọi là "bộ hoàn thiện" và bạn thường chỉ nên tạo một cái cho một lớp có trạng thái (ví dụ: các trường) bao gồm các tài nguyên không được quản lý (tức là: con trỏ để xử lý truy xuất thông qua các cuộc gọi p / gọi). Tuy nhiên, trong .NET 2.0 trở lên, thực sự có một cách tốt hơn để xử lý việc dọn sạch các tài nguyên không được quản lý: SafeHandle . Với điều này, bạn sẽ không bao giờ cần phải viết một bộ hoàn thiện nữa.
Bạn không cần một cái trừ khi lớp của bạn duy trì các tài nguyên không được quản lý như các tệp Windows xử lý.
Nó được gọi là bộ hủy / bộ hoàn thiện và thường được tạo khi triển khai mẫu Loại bỏ.
Đó là một giải pháp dự phòng khi người dùng trong lớp của bạn quên gọi Dispose, để đảm bảo rằng (cuối cùng) tài nguyên của bạn sẽ được giải phóng, nhưng bạn không có bất kỳ đảm bảo nào khi gọi hàm hủy.
Trong câu hỏi Stack Overflow này , câu trả lời được chấp nhận cho thấy chính xác cách triển khai mẫu xử lý. Điều này chỉ cần thiết nếu lớp của bạn chứa bất kỳ tài nguyên không được khai thác nào mà trình thu gom rác không quản lý để tự dọn sạch.
Một thực hành tốt là không triển khai bộ hoàn thiện mà không cung cấp cho người dùng của lớp khả năng Xử lý đối tượng theo cách thủ công để giải phóng tài nguyên ngay lập tức.
Khi bạn có tài nguyên không được quản lý và bạn cần chắc chắn rằng chúng sẽ được dọn sạch khi đối tượng của bạn biến mất. Ví dụ tốt sẽ là các đối tượng COM hoặc Trình xử lý tệp.
Tôi đã sử dụng một hàm hủy (chỉ dành cho mục đích gỡ lỗi) để xem liệu một đối tượng có bị xóa khỏi bộ nhớ trong phạm vi của ứng dụng WPF hay không. Tôi không chắc liệu bộ sưu tập rác có thực sự thanh lọc đối tượng khỏi bộ nhớ hay không, và đây là một cách tốt để xác minh.
Công cụ hủy cấu trúc cung cấp một cách ngầm để giải phóng các tài nguyên không được quản lý được gói gọn trong lớp của bạn, chúng được gọi khi GC đi xung quanh nó và chúng gọi ngầm phương thức Finalize của lớp cơ sở. Nếu bạn đang sử dụng nhiều tài nguyên không được quản lý, tốt hơn là cung cấp một cách rõ ràng để giải phóng các tài nguyên đó thông qua giao diện IDis Dùng. Xem hướng dẫn lập trình C #: http://msdn.microsoft.com/en-us/l Library / 66x5fx1b.aspx