2012-08-25 25 views
22

Tôi có một lớp học với các thành viên tĩnh mở rộng, một số trong đó giữ tham chiếu đến các đối tượng được quản lý và không được quản lý. Ví dụ:Làm thế nào và khi nào các thành viên C# tĩnh bị xử lý?

Ví dụ: hàm tạo tĩnh được gọi ngay khi Loại được tham chiếu, điều này khiến lớp của tôi quay lên mộtQuy tích nhiệm vụ. Điều này xảy ra khi một trong các phương thức tĩnh được gọi, ví dụ.

Tôi đã triển khai IDisposable, cung cấp cho tôi các phương pháp xử lý việc xử lý trên bất kỳ đối tượng thể hiện nào mà tôi đã tạo. Tuy nhiên, những phương thức này không bao giờ được gọi nếu người tiêu dùng không tạo ra bất kỳ đối tượng thể hiện nào từ lớp của tôi.

Tôi nên đặt mã để xử lý các tham chiếu được duy trì bởi phần tĩnh của lớp học ở đâu và ở đâu? Tôi luôn nghĩ rằng việc loại bỏ các tài nguyên tham chiếu tĩnh xảy ra khi đối tượng dụ cuối cùng được giải phóng; đây là lần đầu tiên tôi tạo ra một lớp mà không có trường hợp nào có thể được tạo ra.

+1

mục tĩnh có sẵn cho toàn bộ thực thi của ứng dụng. Bạn không tạo các mục tĩnh bằng cách sử dụng từ khóa MỚI, vì vậy điều này có nghĩa là bạn không có nhiều phiên bản của bất kỳ điều gì, bởi vì bạn thực sự không khởi tạo bất kỳ điều gì. Về các đối tượng được quản lý, đừng lo lắng về chúng, GC sẽ chăm sóc chúng. Giới thiệu về các tài nguyên không được quản lý cố gắng sử dụng chúng trong một lớp không tĩnh hoặc chúng sẽ được giữ cho đến khi bạn đóng ứng dụng của mình. Các mục tĩnh không hỗ trợ vứt bỏ. – alexandrudicu

+0

Cảm ơn. Có vẻ như tôi cần xem xét lại thiết kế của mình ở đây. – Joe

Trả lời

35

Biến tĩnh của lớp học không được thu thập rác cho đến khi miền ứng dụng lưu trữ lớp của bạn được tải xuống. Phương thức Dispose() sẽ không được gọi, bởi vì nó là một phương thức thể hiện, và bạn nói rằng bạn sẽ không tạo ra bất kỳ trường hợp nào của lớp của bạn.

Nếu bạn muốn sử dụng phương thức Dispose(), hãy làm cho đối tượng của bạn trở thành đơn lẻ, tạo một thể hiện của nó và loại bỏ nó một cách rõ ràng khi ứng dụng của bạn chuẩn bị thoát.

public class MyClass : IDisposable { 
    public IList List1<int> {get; private set;} 
    public IDictionary<string,string> Dict1 {get; private set;} 
    public void Dispose() { 
     // Do something here 
    } 
    public static MyClass Instance {get; private set;} 
    static MyClass() { 
     Instance = new MyClass(); 
    } 
    public static void DisposeInstance() { 
     if (instance != null) { 
      Instance.Dispose(); 
      Instance = null; 
     } 
    } 
} 
+0

Điều đó có ý nghĩa. Tôi nghi ngờ rằng tôi có thể phải sử dụng một Singleton patter cuối cùng về điều này ... cảm ơn sự giúp đỡ của bạn. – Joe

0

Bạn nên vứt bỏ các đối tượng này theo cách thủ công, không có cách nào để tạo "trình hoàn thiện" cho tài nguyên tĩnh.

+1

Tôi sẽ xử lý chúng theo cách thủ công như thế nào? Tôi sẽ được thông báo rằng tôi cần phải làm như thế nào? – Joe

+0

@ Joe Đó là hoàn toàn tùy thuộc vào bạn để quyết định. Chỉ có bạn biết khi nào cần gọi Vứt bỏ thứ gì đó được giữ tĩnh. Ví dụ: – vcsjones

+0

, xem ví dụ trong câu hỏi ban đầu, nơi tôi quay lên chặnQueue of Actions. Hàng đợi này sẽ chạy cho đến khi người dùng không còn muốn thả Hành động vào nó (thông qua phương thức tĩnh). Để tôi làm rõ hơn; khi nào tôi giết nhiệm vụ làm cạn kiệt hàng đợi đó? Vì vậy, khi nào tôi sẽ giết nó? Làm cách nào để biết lớp học của tôi không còn trong "phạm vi" đối với người dùng? Ví dụ: – Joe

0
public class Logger : IDisposable 
{ 

    private string _logDirectory = null; 
    private static Logger _instance = null; 

    private Logger() : this(ConfigurationManager.AppSettings["LogDirectory"]) 
    { 
     AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; 
    } 

    private Logger(string logDirectory) 
    { 
    } 

    public static Logger Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new Logger(); 
      return _instance; 
     } 
    } 

    private void CurrentDomain_ProcessExit(object sender, EventArgs e) 
    { 
     Dispose(); 
    } 



    public void Dispose() 
    { 
     // Dispose unmanaged resources 
    } 
} 
Các vấn đề liên quan