2009-09-14 76 views
5

Có cách nào để "tự động" chạy mã kết thúc/phá hủy ngay sau khi biến mất phạm vi trong ngôn ngữ .Net? Nó xuất hiện với tôi rằng kể từ khi thu gom rác chạy ở một thời điểm không xác định, mã destructor không chạy ngay khi biến mất phạm vi. Tôi nhận ra tôi có thể kế thừa từ IDisposable và rõ ràng gọi Dispose trên đối tượng của tôi, nhưng tôi đã hy vọng rằng có thể có một giải pháp tay-off, tương tự như cách non -.Net C++ xử lý sự phá hủy đối tượng.Có thể chạy mã khi một đối tượng nằm ngoài phạm vi trong .Net không?

hành vi mong muốn (C#):

public class A { 
    ~A { [some code I would like to run] } 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
    // At this point, I would like my destructor code to have already run. 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
} 

Ít mong muốn:

public class A : IDisposable { 
    [ destructor code, Dispose method, etc. etc.] 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
    try { 
     ... 
    } 
    finally { 
     myA.Dispose(); 
    } 
} 

Trả lời

9

Việc sử dụng cấu trúc đến gần nhất với những gì bạn muốn:

using (MyClass o = new MyClass()) 
{ 
... 
} 

Dispose() là được gọi tự động, ngay cả khi một ngoại lệ xảy ra. Nhưng lớp của bạn phải triển khai IDisposable.

Nhưng điều đó không có nghĩa là đối tượng bị xóa khỏi bộ nhớ. Bạn không kiểm soát được điều đó.

+0

(+1) Cần lưu ý rằng "sử dụng" là viết tắt để sử dụng phương pháp Vứt bỏ và đặc biệt không sử dụng trình phá hủy và loại bỏ đối tượng khỏi bộ nhớ. –

4

Từ khóa sử dụng với một đối tượng thực hiện IDisposable thực hiện điều đó.

Ví dụ:

using(FileStream stream = new FileStream("string", FileMode.Open)) 
{ 
    // Some code 
} 

này được thay thế bởi trình biên dịch để:

FileStream stream = new FileStream("string", FileMode.Open); 
try 
{ 
    // Some code 
} 
finally 
{ 
    stream.Dispose(); 
} 
3

Thật không may, không.

Tùy chọn tốt nhất của bạn là triển khai IDisposable với IDisposable pattern.

+0

Xem thêm http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae – TrueWill

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