2009-08-25 45 views
16

Làm cách nào để xử lý đối tượng StringBuilder hiệu quả? Nếu người dùng tạo nhiều báo cáo trong một lần ngồi, ứng dụng của tôi sẽ sử dụng một lượng bộ nhớ khổng lồ.Xử lý đối tượng StringBuilder

Tôi đã đọc trong một vài trang web trực tuyến mà tiếp theo có thể giúp:

StringBuilder sb = new StringBuilder(1000000); 

// loop goes here adding lots of stuff to sb 

exampleObject.Text = sb.ToString(); 

sb.Length = 0; 

Liệu dòng cuối cùng thực sự giúp đỡ? Bất kỳ cách nào khác để đối phó với điều này?

NB: Điều này không thực sự ngăn người dùng của tôi tiếp tục sử dụng ứng dụng. Tôi chỉ tự hỏi nếu có một cách để tránh sử dụng bộ nhớ dư thừa.

+2

lấy ra 1000000 có thể giúp – David

+3

Làm cách nào? Bộ nhớ phân bổ trước đã giúp ích rất nhiều. Việc cho phép StringBuilder thay đổi kích thước liên tục làm chậm mọi thứ xuống một chút. – Druid

Trả lời

33

Không, StringBuilder là tài nguyên được quản lý hoàn toàn. Bạn chỉ nên loại bỏ tất cả các tham chiếu đến nó. Mọi thứ khác được đưa về chăm sóc bởi các nhà sưu tập rác:

StringBuilder sb = ...; 
// ... do work 
sb = null; // or simply let it go out of scope. 

Trong .NET, không có xác định delete (như C++, nơi bạn giải phóng bộ nhớ được phân bổ cho một đối tượng duy nhất.) Chỉ GC có thể giải phóng bộ nhớ. Bằng cách mất tất cả các tham chiếu đến một đối tượng, bạn sẽ cho phép GC có thể xử lý đối tượng nếu nó muốn. Bạn có thể ép buộc thu gom rác bằng cách gọi phương thức System.GC.Collect. Tuy nhiên, bạn không nên thao tác với GC trừ khi bạn thực sự biết mình đang làm gì. GC là thông minh. Nó hiếm khi có lợi để ép buộc nó.

+1

thêm một GC.Collect() là hoàn toàn hợp lệ nếu sử dụng bộ nhớ trong ứng dụng là quá nhiều đến mức gây ra vấn đề với hết mệt mỏi bộ nhớ. Bộ sưu tập rác Net sẽ tự động dọn sạch nó khi bạn đang cố gắng cấp phát bộ nhớ bổ sung và o/s bị bỏ đói hoặc trong chu kỳ tiếp theo. Thông thường, bạn không cần nó trừ khi ứng dụng của bạn hoạt động rất hiệu quả. –

1

Trừ khi 'sử dụng bộ nhớ quá mức' là một vấn đề, tôi sẽ để nguyên nó và không lo lắng về nó.

.NET trong hầu hết các trường hợp là đủ thông minh để tránh thực hiện thu gom rác nếu bạn có đủ bộ nhớ.

2

Nếu bạn đang tạo nhiều báo cáo, bạn có thể xem xét việc sử dụng lại một StringBuilder duy nhất thay vì phân bổ một báo cáo mới cho mỗi báo cáo.

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