2010-04-10 20 views
8

Theo sau từ my question here, nếu tôi thay thế một hình ảnh trong một hộp hình ảnh, tôi có nên vứt bỏ hình ảnh gốc trước không?Nếu tôi thay thế hình ảnh trong điều khiển PictureBox, trước tiên tôi có nên vứt bỏ hình ảnh gốc không? .Net Winforms

Hoặc, những gì về tình trạng này:

Dim bm As New Bitmap(32,32) 
bm = New Bitmap(32,32) 
bm = New Bitmap(32,32) 
bm = New Bitmap(32,32) 

Liệu bm chỉ cần đăng ký bán ở cuối, hoặc nó phải được xử lý trước mỗi tái tạo?


Cảm ơn tất cả các câu trả lời. Một sự giám sát lớn ở đó. Tôi biết một kiểm soát đã chăm sóc xử lý con cái của nó nhưng nó đã không xảy ra với tôi rằng tôi nên xử lý một hình ảnh cũ nếu tôi thay thế nó.

Trả lời

5

Có, bạn nên vứt bỏ đối tượng cũ trước khi tạo một hình ảnh mới trên cùng một biến. Bằng cách tạo ra một hình ảnh mới với cùng một biến, bạn đang loại bỏ một tham chiếu đến nó. Nếu không có tham chiếu đến đối tượng cũ, bạn đang biểu thị rằng nó nên được chọn bởi GC (Garbage Collector). Mặc dù về mặt kỹ thuật, "nên" cuối cùng dẫn đến bộ nhớ được giải phóng giả định rằng finalizer đảm bảo rằng các tài nguyên không được quản lý được quan tâm, đây là một giả định lớn (Bạn thậm chí không thể giả định rằng finalizer sẽ được gọi) và nó gây ra nhiều công việc hơn cho hệ thống. Các trình hoàn thiện không mặc định làm cho công việc bổ sung cho GC về xúc tiến mức thu gom rác, dẫn đến việc mất nhiều thời gian hơn cho bộ nhớ được giải phóng và số lần GC phải chạy để làm như vậy.

Giả định rằng tất cả được viết để đảm bảo trình xử lý xử lý nó. Bất cứ khi nào một đối tượng có phương thức Dispose (bất cứ thứ gì thực hiện IDisposable mà BitMap làm), nó sẽ được gọi trước khi loại bỏ tham chiếu đến đối tượng (rơi ra khỏi phạm vi, loại bỏ tham chiếu đến đối tượng, v.v.).

Dưới đây là một bài viết về cách Collector rác làm việc trong .net

http://www.devx.com/dotnet/Article/33167

Dưới đây là làm thế nào MS nói dispose/finalizer cần được thực hiện:

http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

2

Có bạn Nên. Nó thực hiện IDisposable.
Theo quy tắc chung, hãy bỏ tất cả các đối tượng triển khai IDisposable. Đừng để nó vào GC.

2

Bm chỉ cần được xử lý ở cuối hoặc nó có được xử lý trước mỗi lần tạo lại không?

Nó phải được xử lý trước mỗi "giải trí". Đừng nhầm lẫn một đối tượng với một tham chiếu đối tượng. "bitmap mới" tạo một đối tượng mới. "bm" là tham chiếu xảy ra để trỏ đến đối tượng đó. Chúng không giống nhau. Bạn không phải là "tái tạo" bất kỳ đối tượng nào ở đây - bạn đang tạo một đối tượng mới và sau đó thả tất cả các tham chiếu đến đối tượng trước đó, nghĩa là tôi sẽ thu gom rác trong một tương lai gần (gần).

+0

Cảm ơn bạn đã thanh toán bù trừ cho tôi. Tôi biết tất cả các khái niệm trong câu trả lời của bạn, nhưng một số ngày tôi bị đóng băng não! Bao giờ quên làm thế nào để đánh vần một từ ngắn? Đó là cảm giác của nó. – Jules

2

Khi thay đổi hình ảnh được liên kết với PictureBox, người ta phải gọi Dispose trên hình ảnh đã có nếu và chỉ khi không có gì khác sẽ sử dụng hình ảnh đó. Để biết điều đó, người ta phải biết hình ảnh cũ đến từ đâu. Trong một số trường hợp, hình ảnh sẽ được tạo chỉ nhằm mục đích được gán cho PictureBox. Trong các trường hợp khác, hình ảnh có thể là hình ảnh được chia sẻ và/hoặc được sử dụng lại.Nếu hình ảnh chỉ được tạo cho mục đích giao cho PictureBox, nó phải là Dispose d nếu PictureBox được xử lý hoặc đưa ra một hình ảnh khác. Nếu hình ảnh được cho là được chia sẻ hoặc tái sử dụng, các điều kiện như vậy không được làm cho nó bị xử lý.

Cách thích hợp để giải quyết vấn đề như vậy nói chung sẽ cho các lớp học mà có IDisposable tài sản (như PictureBox, với Image) để sử dụng một SetImage phương pháp rõ ràng hơn là có một mutable Image bất động sản, và đối với phương pháp SetImage để bao gồm một tham số cho biết liệu PictureBox có nên chịu trách nhiệm xử lý nó hay không. Gọi số SetImage hoặc Dispose trên PictureBox phải gọi Dispose trên hình ảnh được giữ nếu và chỉ khi cuộc gọi trước đó SetImage cho nó trách nhiệm đó. Thật không may, PictureBox không hoạt động theo cách đó, nhưng tôi rất khuyên bạn nên sử dụng nó như là một mô hình cho các lớp học trong tương lai bạn viết mà giữ IDisposable đối tượng.

+0

Đó là câu trả lời duy nhất nói về phần đầu tiên của câu hỏi, về việc có vứt bỏ hình ảnh của 'PictureBox' trước khi ấn định hay không. –

+1

@UweKeim: Tôi nghĩ đó là một vấn đề quan trọng mà không ai trong số các câu trả lời khác được đề cập đến. Rất vui khi bạn thấy câu trả lời của tôi hữu ích. Tôi nghi ngờ phải của Framework đã được viết trước khi mọi người thực sự tìm ra cách IDisposable sẽ làm việc, và những lớp học cũ được đặt trong đá, nhưng không có lý do lớp mới hơn nên lặp lại những sai lầm cũ. – supercat

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