2009-07-10 13 views
6

Đọc về số Dispose pattern, tôi thấy tài liệu liên tục tham khảo "làm sạch được quản lý và không được quản lý mã". Và trong việc thực hiện kinh điển của phương thức Dispose, tôi thấy các luồng cụ thể (tùy thuộc vào việc disposing là đúng hay sai) dành riêng cho việc dọn dẹp các đối tượng được quản lý so với các đối tượng không được quản lý.Mẫu vứt bỏ: Làm thế nào để tôi biết những gì được quản lý và những gì không được quản lý?

Nhưng tôi có phải là những người mới chơi kém, biết loại nào được quản lý và không được quản lý không?

Trả lời

3

Phiên bản ngắn là: mọi thứ cũng triển khai IDisposable cần được gọi theo phương thức Dispose của bạn. FxCop cũng sẽ cho bạn biết nếu bạn đang thiếu một cái gì đó (hoặc không sử dụng IDisposable ở tất cả khi bạn nên).

+0

Mặc dù điều này thực sự không trả lời được câu hỏi, tôi không còn tin rằng câu trả lời hay sẽ tồn tại. Điều này cung cấp giải pháp thiết thực tốt nhất cho các vấn đề phát sinh khi lập trình viên không thể đưa ra phán quyết về "quản lý" của một loại, nhưng tôi nghĩ một lập trình viên muốn một người quyết đoán để đưa ra phán quyết đó chỉ đơn giản là may mắn. –

0

Nếu bạn không biết, các loại bạn đang sử dụng có thể được quản lý.

Loại không được quản lý đề cập đến các loại không an toàn, tức là không tuân thủ các yêu cầu về an toàn CLR.

Great definition linked:

Cập nhật

Tôi không hiểu downvote? Câu hỏi đặt ra là làm cách nào để phân biệt giữa các loại được quản lý và không được quản lý?

Tất cả các câu trả lời khác đã giải quyết được câu hỏi IDispose, thay vì câu hỏi được quản lý/không được quản lý !?

Cập nhật 2

Vẫn không có lời giải thích của downvote thứ hai ...

Tôi đồng ý, một đối tượng IDisposable nên luôn luôn được xử lý, nhưng điều đó không trả lời các câu hỏi về quản lý so với không được quản lý .

+0

Tương tự như bình luận khác của tôi, làm thế nào để bạn * biết * rằng một loại, như bạn nói, không tuân theo các yêu cầu an toàn CLR? I E.nếu tôi đã viết một plugin Reflector để báo cáo "unmanagedness" của một loại được chọn, plugin của tôi sẽ kiểm tra loại đó để đưa ra phán quyết dứt khoát? –

0

Tôi chỉ đơn giản đề xuất hủy tất cả các tài nguyên sau khi bạn sử dụng chúng. Bất kỳ thứ gì thường phụ thuộc vào tài nguyên hệ thống như ổ cắm và tài nguyên luồng bạn muốn phát hành rõ ràng. Khi nghi ngờ hãy tiếp tục và vứt bỏ. Giúp bạn tiết kiệm rất nhiều rắc rối trong thời gian dài. Thông thường khi bạn gọi mã không được viết bằng .NET, bạn có thể giả sử nó không phải là "mã được quản lý".

2

Được quản lý hoặc không được quản lý không thực sự quan trọng. Nếu một lớp thực hiện giao diện IDisposable, bạn nên gọi Dispose() khi bạn đã hoàn thành với đối tượng. Cách khác (tốt nhất là) sử dụng số using statement để có Dispose() được gọi tự động khi đối tượng nằm ngoài phạm vi.

@ Rob:
Câu trả lời vẫn giữ nguyên. Nếu lớp của bạn quản lý bất kỳ đối tượng nội bộ nào thực hiện IDisposable, nó cũng nên triển khai IDisposable. Trong phương thức Dispose() của bạn, hãy gọi Dispose trên các đối tượng đó.

+0

Tôi nghĩ câu hỏi được đặt ra từ quan điểm thiết kế IDisposables - tức là những gì nên và không nên được giải phóng khi xử lý và hoàn thiện. – Rob

+1

@Thorarin - Tôi nghĩ điểm Rob đang làm là nếu bạn triển khai mẫu vứt bỏ cổ điển, bạn có cờ isDisposing để cho biết liệu nó có đang xử lý do một cuộc gọi để xử lý hay do việc thực hiện finaliser. Trong trường hợp sau, bạn sẽ cần phải cẩn thận không vứt bỏ các vật thể được quản lý khác vì chúng có thể đã bị thu gom rác. Khi được gọi một cách rõ ràng từ một phương thức Dispose() thì có thể an toàn để loại bỏ chúng. Tuy nhiên, tài nguyên * không được quản lý sẽ được xử lý trong cả hai trường hợp. –

+0

Tôi có xu hướng hướng tới cách tiếp cận Gestapo trên đó: nếu finalizer được gọi là ở tất cả, phàn nàn to với lập trình viên để sửa mã của họ. – Thorarin

5

Không được quản lý nghĩa là các đối tượng Win32 gốc, chủ yếu là xử lý; và tham chiếu đến các đối tượng COM thô. Đây là những tài nguyên không dưới sự kiểm soát của (hoặc được quản lý bởi) .NET CLR.

+0

Đúng, nhưng làm thế nào để một nhà phát triển nghiêm ngặt- quá trẻ có thể sử dụng Win32, COM, v.v. * biết * rằng tài nguyên không nằm dưới sự kiểm soát của CLR, hoặc tệ hơn, * phụ thuộc * vào tài nguyên không 't dưới sự kiểm soát của CLR? Ý tôi là, làm thế nào để bạn * biết * rằng, nói rằng, một xử lý không được quản lý? Có lẽ là kinh nghiệm. Nhưng trong sự vắng mặt của kinh nghiệm đó, làm thế nào là một lập trình viên xanh hơn để làm cho nó đúng mọi lúc? Tôi cho rằng sự hiện diện của giao diện IDisposable là không đủ; lập trình viên trung bình của bạn không được dạy để kiểm tra tài liệu của mọi loại để đề cập đến IDisposable. –

+1

Tôi nói ngược lại. Nếu IDisposable là có, sau đó vứt bỏ. Giai đoạn. Bằng cách đó, các bạn trẻ không cần phải tiếp xúc với chấn thương của COM. –