2013-08-01 24 views
7

Cái nào hoạt động tốt hơn hoặc chính xác hơn? Có tốt hơn khi tạo một đối tượng từ lớp StreamWriter và sử dụng nó thường xuyên trong một phương thức và cuối cùng loại bỏ nó? hoặc tốt hơn là sử dụng một đối tượng từ StringBuilder sau đó tạo đối tượng từ StreamWriter và ngay lập tức bỏ đối tượng đó?Streamwriter vs StringBuilder

1)

var Write = new StreamWriter(string.Format("{0}{1}{2}", Environment.CurrentDirectory, Path.DirectorySeparatorChar, "Dummy.txt")); 
for (int i = 0; i < 100; i++) 
{ 
    //Do something include calculation 
    Write.WriteLine(something); 
} 
Write.Flush(); 
Write.Dispose(); 

2)

var Str = new StringBuilder(); 
for (int i = 0; i <  100; i++) 
{ 
    //Do something include calculation 
    Str.AppendLine(something); 
} 
var Write = new StreamWriter(string.Format("{0}{1}{2}", Environment.CurrentDirectory, Path.DirectorySeparatorChar, "Dummy.txt")); 
Write.Write(Str); 
Write.Flush(); 
Write.Dispose(); 
+8

Don' t sử dụng 'string.Format' trên đường dẫn, thay vì sử dụng' Path.Combine (Environment.CurrentDirectory, "Dummy.txt") '. – Alxandr

+3

để ngay lập tức 'Xử lý' hãy thử nghiên cứu cách sử dụng cấu trúc' using() {} ' – MethodMan

+0

sử dụng khối 'đang sử dụng' với luồngMã: http://stackoverflow.com/questions/212198/what-is-the-c- sharp-using-block-and-why-should-i-use-it – 5uperdan

Trả lời

9

Cách đầu tiên có khả năng sử dụng nhiều thao tác IO hơn, nhưng ít bộ nhớ hơn. Thứ hai cần phải đệm mọi thứ trong bộ nhớ. Điều đó có thể hoặc không có thể là một vấn đề.

Hơn thế nữa của một vấn đề là bạn không sử dụng một tuyên bố using hoặc try/finally, và rằng bạn đang sử dụng string.Format.

tôi sẽ đề nghị:

// Note the more conventional variable names, too... 
string file = Path.Combine(Environment.CurrentDirectory, "Dummy.txt"); 
using (var writer = File.CreateText(file)) 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     writer.WriteLine(...); 
    } 
} 

Ngoài ra, nếu những gì bạn đang viết là một cách tự nhiên thể hiện dưới dạng một truy vấn LINQ (hoặc IEnumerable<string> bất kỳ khác), bạn chỉ có thể sử dụng File.WriteAllLines:

var query = ...; // Something returning an IEnumerable<string> 
var file = Path.Combine(Environment.CurrentDirectory, "Dummy.txt"); 
File.WriteAllLines(file, query); 
3

Nó thực sự phụ thuộc vào bối cảnh của ứng dụng của bạn. Ví dụ, nếu bạn có các chương trình khác lắng nghe những gì xuất phát từ luồng đó, và họ có thể xử lý dữ liệu một mã thông báo tại một thời điểm, thì rõ ràng là thích hợp hơn để đi với phương pháp đầu tiên.

Điều đó nói rằng, nếu bạn chỉ viết những thứ ra một tệp văn bản để lưu trữ, có thể nó sẽ đáng giá cho tùy chọn thứ hai. Tôi nghĩ tùy chọn thứ hai có thể chạy khá nhanh, vì rằng StringBuilder là khá nhanh và bạn chỉ thực hiện một thao tác ghi, thay vì tùy chọn đầu tiên, nơi bạn liên tục tạo đối tượng mới cho mỗi lần viết.