2010-08-04 38 views
9

Điều này có hợp lý không?Sử dụng câu lệnh "sử dụng" để xử lý

Có một lớp đơn giản

class Test 
    { 
    public Test() 
    { 
     // Do whatever 
    } 
    } 

và sau đó instantiating nó

using(new Test()) 
{ 
    // Nothing in here 
} 

Việc sử dụng tuyên bố là có chỉ để chắc chắn kiểm tra được xử lý. Khi nó sẽ được xử lý nếu tôi chỉ cần gọi

new Test() 
+10

Đây có phải là theo giả định rằng 'test' thực hiện 'IDisposable'? –

+0

Không, không. Làm thế nào để biết nếu một lớp học cần phải thực hiện nó hay không? Bạn luôn luôn làm điều đó? – Jla

+3

Tôi * nghi ngờ * rằng bạn đang bối rối "bộ sưu tập khổng lồ" và "xử lý", là hai khái niệm có liên quan nhưng rất khác nhau. –

Trả lời

11

Test không phải là IDisposable, do đó thậm chí sẽ không biên dịch. Nhưng nếu nó dùng một lần, có using sẽ làm điều đó, và new tự nó sẽ không. Đây là một cách sử dụng khác thường, nhưng tôi đã thấy tương tự. Ít khi.

Dựa trên nhận xét của bạn (câu hỏi chính), tôi nghi ngờ rằng bạn đang nhầm lẫn việc thu gom và xử lý rác thải. Không có cách nào để buộc phải làm một thứ gì đó được thu thập, thiếu số GC (bạn nên không phải làm). Trừ khi bạn có thực sự lý do chính đáng để thu thập nó, chỉ cần để cho nó được - rất có thể là nó là "thế hệ 0" và sẽ được thu thập với giá rẻ anyway.

Ngoài ra, "làm bất cứ điều gì" gợi ý làm thứ gì đó trong một hàm tạo nhưng không quan tâm đến đối tượng đã tạo; một phương pháp tĩnh sẽ thích hợp hơn:

public class Test { /* could be static */ 
    public static void DoSomething() { ... } 
} 
... 
Test.DoSomething(); 
+0

Tôi muốn tranh luận về 'sử dụng bất thường', trên thực tế, tôi sử dụng nó khá thường xuyên. – nothrow

+0

@Yossarian - bạn có thể giải thích lý do tại sao và cách tốt hơn phương pháp bình thường? – Kobi

+0

cũng: một số (ban đầu) hành động được ràng buộc với một hành động (cuối cùng), ví dụ: 'HtmlWriter.RenderBeginTag()', 'RenderEndTag()'. Nếu bạn ném ngoại lệ giữa hai (hoặc nếu không quên 'RenderEndTag'), nó sẽ dẫn đến html/xml không đúng định dạng. Vì vậy, tôi đã viết phương pháp mở rộng trên RenderBeginTag, mà trả về lớp IDisposable chỉ đơn giản là gọi RenderEndTag, và bây giờ tôi thấy rõ ràng, (thông qua thụt đầu dòng) ở đâu là thẻ mở/đóng. Một ví dụ khác là đo khoảng thời gian một số khối cần thực hiện. Nhưng, YMMV. – nothrow

2

Bằng cách không gán cá thể cho biến, nó sẽ đủ điều kiện cho GC ngay khi nó nằm ngoài phạm vi.

Hoặc, có điều gì khác bạn đang cố thực hiện với điều này không?

+0

Không có gì khác. Như Marc nhấn mạnh tôi đã chạy hành động của tôi trong constructor lớp mà có vẻ là xấu (hoặc ít nhất là bất thường) thực hành. Tôi không cần lớp nữa rồi. – Jla

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