2012-12-21 19 views
47

Tôi đang nghiên cứu cách trình thu gom rác hoạt động trong C#. Tôi bối rối về việc sử dụng các phương thức Destructor, DisposeFinalize.Sự khác biệt giữa hàm hủy, xử lý và hoàn thiện phương thức

Theo nghiên cứu và hiểu biết của tôi, có phương pháp Destructor trong lớp tôi sẽ yêu cầu bộ thu gom rác thực hiện thu gom rác theo cách được đề cập trong phương pháp hủy không thể gọi rõ ràng trên các phiên bản của lớp.

Phương thức Dispose có nghĩa là cung cấp cho người dùng quyền kiểm soát việc thu thập rác. Phương thức Finalize giải phóng các tài nguyên được sử dụng bởi lớp, chứ không phải chính đối tượng đó.

Tôi không chắc liệu mình có hiểu đúng cách hay không. Hãy làm rõ những nghi ngờ. Bất kỳ liên kết hoặc hướng dẫn thêm nào đều được chào đón.

Trả lời

45

Destructor ngầm gọi phương thức Finalize, chúng giống nhau về mặt kỹ thuật. Vứt bỏ có sẵn với những đối tượng mà thực hiện giao diện IDisposable.

Bạn có thể thấy: Destructors C# - MSDN

Destructor ngầm gọi Finalize trên lớp cơ sở của đối tượng .

Ví dụ so với cùng liên kết:

class Car 
{ 
    ~Car() // destructor 
    { 
     // cleanup statements... 
    } 
} 

đang Destructor được ngầm dịch sang đoạn mã sau:

protected override void Finalize() 
{ 
    try 
    { 
     // Cleanup statements... 
    } 
    finally 
    { 
     base.Finalize(); 
    } 
} 

hiểu biết của bạn cho Destructor là đúng:

Từ MSDN

Trình lập trình không kiểm soát được khi nào trình phá hủy được gọi là vì điều này được xác định bởi bộ thu gom rác. Thùng rác kiểm tra bộ sưu tập đối với các đối tượng không còn được sử dụng bởi ứng dụng . Nếu nó xem xét một đối tượng đủ điều kiện để hủy, nó gọi destructor (nếu có) và reclaims bộ nhớ được sử dụng để lưu trữ đối tượng. Destructors cũng được gọi khi chương trình thoát. Đó là có thể buộc thu gom rác bằng cách gọi Thu thập, nhưng hầu hết trong số thời gian, điều này nên tránh vì nó có thể tạo ra các vấn đề hiệu suất .

+0

Làm thế nào để thu gom rác bằng cách gọi phương thức 'Collect()' có thể tạo ra các vấn đề về hiệu suất? – Destructor

35

Về C#, một destructor và finalizer về cơ bản khái niệm hoán đổi cho nhau, và nên được sử dụng để giải phóng không được quản lý nguồn khi một loại được thu thập, xử lý đối với bên ngoài ví dụ. Đó là rất hiếm khi bạn cần viết trình hoàn thành.

Vấn đề với đó là GC là không xác định, vì vậy phương pháp Dispose() (thông qua IDisposable) làm cho nó có thể để hỗ trợ xác định dọn dẹp.Điều này không liên quan đến việc thu thập rác và cho phép người gọi phát hành bất kỳ tài nguyên nào sớm hơn. Nó cũng thích hợp để sử dụng với các tài nguyên được quản lý (ngoài không được quản lý), ví dụ nếu bạn có loại đóng gói (nói) kết nối cơ sở dữ liệu, bạn có thể muốn loại bỏ loại kết nối.

+0

vì vậy những gì tôi cảm thấy là phương pháp Destructor chỉ nên chứa mã mà phải được thực hiện trước khi nó bị hủy diệt, phương thức Finalize chủ yếu sẽ sau đó được thừa hưởng từ lớp siêu. –

+3

@VictorMukherjee một lần nữa, họ (destructor và finalizer) có thể hoán đổi cho nhau. Nó là 'Dispose()' sẽ được gọi là * trước * hủy diệt, nhưng điều đó không được gọi là hủy hoặc bộ hoàn thiện –

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