Computer >> Máy Tính >  >> Lập trình >> C#

Sự khác biệt giữa Finalize và Dispose trong C # là gì?

Kết thúc

Finalize () được gọi bởi Garbage Collector trước khi một đối tượng đủ điều kiện để thu thập được thu hồi. Bộ thu gom rác sẽ chịu trách nhiệm phân bổ bộ nhớ cho đối tượng không được tham chiếu. Bộ thu gom rác gọi phương thức này tại một số thời điểm sau khi không còn tham chiếu hợp lệ đến đối tượng đó trong bộ nhớ.

Khuôn khổ không đảm bảo rằng khi điều này xảy ra, chúng ta có thể buộc Thu gom rác nhưng nó sẽ ảnh hưởng đến hiệu suất của một chương trình. Finalize () thuộc về lớp Object và nó sẽ được gọi trong thời gian chạy.

Ví dụ

using System;
namespace DemoApplication{
   public class Demo{
      ~Demo(){
         Console.WriteLine("Finalize called");
      }
   }
}

Vứt bỏ

Có một số tài nguyên như tay cầm cửa sổ, kết nối cơ sở dữ liệu, kết nối mạng, tệp, v.v. mà Trình thu gom rác không thể thu thập. Nếu chúng ta muốn giải phóng rõ ràng một số đối tượng cụ thể thì đây là cách tốt nhất để triển khai IDisposable và ghi đè phương thức Dispose () của giao diện IDisposable.

Phương thức Dispose () không được gọi tự động và chúng ta phải gọi nó một cách rõ ràng từ một ứng dụng khách khi một đối tượng không còn cần thiết nữa. Dispose () có thể được gọi ngay cả khi các tham chiếu khác đến đối tượng còn sống.

Ví dụ

using System;
namespace DemoApplication{
   public class Demo : IDisposable{
      private bool disposed = false;
      public void Dispose(){
         Dispose(true);
         GC.SuppressFinalize(this);
      }
      protected virtual void Dispose(bool disposing){
         if (!disposed){
            if (disposing){
               //clean up managed objects
            }
            //clean up unmanaged objects
            disposed = true;
         }
      }
   }
}

Microsoft khuyến nghị chúng tôi nên triển khai cả Vứt bỏ và Hoàn thiện khi làm việc với các tài nguyên không được quản lý. Quá trình triển khai Finalize sẽ chạy và tài nguyên sẽ vẫn được giải phóng khi đối tượng được thu thập rác ngay cả khi nhà phát triển bỏ qua việc gọi phương thức Dispose một cách rõ ràng.