2013-04-19 8 views
8

Tôi cho rằng đây là một câu hỏi rất ngớ ngẩn nhưng tôi đã tìm kiếm và không thể tìm thấy câu trả lời cho các câu hỏi sau đây. Thực sự đánh giá cao câu trả lời làm sáng tỏ điều này.Tạo đối tượng mới liên tục trên cùng một biến

1) Điều gì sẽ xảy ra với đối tượng trước nếu tạo một đối tượng mới trong cùng một phương thức. Ví dụ:

DataTable dataTable = new DataTable(); 
dataTable = new DataTable(); // Will the previously created object be destroyed and memory freed? 

2) Câu hỏi tương tự như (1) nhưng trên biến tĩnh. Ví dụ:

static private DataView dataView; 

private void RefreshGridView() 
{ 
    dataView = new DataView(GetDataTable()); // Will the previously created objects be destroyed and memory freed? 
    BindGridView(); 
} 

Cảm ơn!

+0

Tôi nhận ra rằng mẫu mã trong (1) đơn giản hóa một cái gì đó phức tạp hơn, nhưng tôi chỉ nghĩ rằng tôi sẽ nhận xét rằng nó giống như một thực hành mã hóa khó chịu mà tôi thấy mọi lúc , thường là dưới dạng gán một giá trị được trả về bởi hàm cho biến ngay sau khi gán đối tượng mới ban đầu trong khai báo biến. Không có vấn đề gì trong việc thực hiện nhiệm vụ đầu tiên (trừ khi nhà xây dựng gây ra một số loại tác dụng phụ, đó sẽ là một việc thực hiện rất kém/có vấn đề). –

Trả lời

11

// đối tượng được tạo trước đó sẽ bị phá hủy và bộ nhớ được giải phóng?

Tiềm năng. Ngay khi bạn thực hiện việc này, bạn sẽ không còn giữ tham chiếu đến số DataTable gốc nữa. Miễn là không có gì khác tham chiếu đến đối tượng này, nó sẽ trở thành đủ điều kiện để thu gom rác thải. Tại một số điểm sau đó, GC sẽ chạy, và thu thập các đối tượng, mà lần lượt sẽ giải phóng bộ nhớ của nó.

Điều này đúng với các biến tĩnh, dụ và địa phương. Cơ chế này giống hệt nhau trong tất cả các scnearios này.

Lưu ý rằng nếu đối tượng bạn đang tham chiếu thực hiện IDisposable, bạn nên gọi Dispose() trên đó trước khi mất tham chiếu. Về mặt kỹ thuật, triển khai thực hiện IDisposable được thực hiện đúng cách sẽ cuối cùng là xử lý mọi thứ đúng cách, nhưng tài nguyên gốc có thể bị ràng buộc cho đến khi thu thập GC xảy ra, điều này có thể không xảy ra nhanh chóng. Lưu ý rằng điều này không liên quan gì đến bộ nhớ (được quản lý), nhưng vẫn là một thực hành tốt.

Điều đó đang được nói, ví dụ đầu tiên của bạn là thực tiễn không tốt. Trong khi bộ nhớ sẽ (cuối cùng) được dọn sạch, bạn đang thực hiện phân bổ bổ sung mà không phục vụ mục đích nào, vì vậy tốt hơn là không nên "phân bổ kép" biến đó.

+0

Hiểu, cảm ơn câu trả lời phức tạp trong một thời gian ngắn! – csharp101

2

Câu trả lời ngắn gọn là tất cả điều này được xử lý bởi bộ thu gom rác. Các phiên bản sẽ không bị xóa ngay lập tức, nhưng chúng sẽ được đánh dấu là "không thể truy cập" và được giải phóng sau.

Tôi đề nghị có đọc qua bài viết Garbage Collection tại MSDN

+0

Cảm ơn câu trả lời nhanh và nguồn kiến ​​thức! =) – csharp101

1

Đối tượng là biến tham chiếu trong C#. Điều đó có nghĩa là chúng lưu trữ các tham chiếu bộ nhớ trong chúng.

Vì vậy, khi bạn gán lại một đối tượng, bạn chỉ cần ghi đè giá trị trước đó (tham chiếu bộ nhớ) mà nó đã giữ. Và giá trị trước đó bây giờ đủ điều kiện cho Garbage Collection. Bây giờ công việc của Garbage Collector đã giải phóng bộ nhớ đó. Tương tự đối với tất cả các loại biến bao gồm static