2010-03-19 30 views
7

Tôi sẽ làm cho nó đơn giản. Tôi có một stringwriter như là một thành viên lớp do đó tôi không thể sử dụng bằng cách sử dụng(). Tôi muốn có một sw trống mỗi khi tôi gọi một chức năng nhất định. Tôi có nên gọi Dispose() trên sw và phân bổ một đối tượng mới? hoặc tôi nên làm một cái gì đó như .close() và làm cái gì khác để làm trống bộ đệm?Tôi có nên vứt bỏ một người viết chuỗi không? hoặc tái sử dụng bằng cách nào đó?

Trả lời

5

Nếu bạn có một chức năng nhất định cần một StringWriter trống mỗi lần, tại sao không chỉ tạo một StringWriter mới trong hàm đó?

Nhưng, quay trở lại câu hỏi ban đầu của bạn, tôi đã sử dụng .NET Reflector để kiểm tra xem Xử lý của StringWriter là gì. Tất cả những gì nó làm là gọi lại vào lớp cơ sở '(TextWriter) Dispose - không làm gì cả. Vì vậy, nếu bạn thực sự cần phải "tái sử dụng" StringWriter bạn đang phơi bày, có vẻ như sẽ an toàn khi chỉ tạo lại một cá thể mới khi bạn cần nó (mặc dù tôi nghĩ bạn nên cân nhắc lại thiết kế của mình.). để lộ một StringWriter như một thành viên công khai trên một lớp).

+0

tôi chưa bao giờ nói là công khai;). Yêu cầu của nó cho một cuộc gọi lại và tôi không thể vượt qua trong một chuỗi ký tự để nó là một thành viên. –

11

Tôi đồng ý với người trả lời khác, bạn nên xem thiết kế của mình để xem liệu người viết chuỗi cấp lớp có thực sự là con đường để đi hay không.

Tuy nhiên, tôi không đồng ý với quan điểm về

"Tất cả nó làm là gọi trở lại vào lớp cơ sở (TextWriter) Vứt bỏ -. mà không làm gì"

Khi tiêu thụ lớp học, nếu bạn thực hiện gọi là Dispose, bạn thực sự nên gọi nó, hoặc rõ ràng hoặc bằng cách "sử dụng".

Trong trường hợp này, đúng là StringWriter.Dispose gọi xuống TextWriter.Dispose không có gì, nhưng tôi thực sự không khuyên "chỉ bỏ qua nó".

Toàn bộ điểm thừa kế và đa hình là loại này có thể được hoán đổi cho loại có nguồn gốc.

Hôm nay là StringWriter trong mã của bạn, có thể được đổi chỗ cho ngày EvenBetterStringWriter ngày mai có thể có triển khai có ý nghĩa hơn cho Dispose.

Nếu nó triển khai Dispose và bạn sử dụng nó, bạn nên nghiêm túc suy nghĩ về việc bỏ cuộc gọi khi bạn hoàn tất.

Có kiến ​​thức đặc quyền về nội bộ của việc triển khai cụ thể cụ thể này là nguy hiểm khi bạn để nó hướng dẫn thiết kế của bạn như thế này. Tác giả của lớp học StringWriter rõ ràng có nghĩa là Vứt bỏ để được gọi, hoặc nó sẽ không có ở đó.

+0

+1. Vì vậy, bạn đề nghị tôi nên chỉ cần gọi vứt bỏ và tạo ra một chuỗi mới mỗi lần? Không có cách nào để làm trống một cái hiện có? (hoặc có thể không có lợi ích) –

+0

Vấn đề với cách tiếp cận sử dụng lại là, bạn có các vấn đề khác cần cân nhắc: nếu bạn viết chuỗi 1MB, sau đó sử dụng lại 2KB, thì 1022KB còn lại ở đó, không giải phóng, hay là nó dễ hiểu cho việc thu gom rác thải? Đây chỉ là một ví dụ. Nói chung - tôi có lẽ sẽ đi xuống con đường của việc tạo ra nó mỗi lần, và chỉ lo lắng nếu có một vấn đề về hiệu ứng đặc biệt xung quanh làm điều này. –

+1

"Tác giả của lớp StringWriter rõ ràng có nghĩa là Vứt bỏ được gọi, hoặc nó sẽ không có ở đó." - Ồ không. Vứt bỏ là có bởi vì StringWriter xuất phát từ TextWriter tổng quát hơn. – mrec

0

Từ O'reilly của C# trong một nutshell:

Tuy nhiên, ba kịch bản cho không xử lý:

  • ...
  • ...
  • Khi phương thức Dispose của một đối tượng là không cần thiết bởi thiết kế và xử lý đối tượng mà sẽ thêm phức tạp cho chương trình của bạn

Phạm trù thứ ba bao gồm các loại sau đây: WebClient, StringReader, String Writer, và BackgroundWorker (trong System.ComponentModel). Các loại này được dùng một lần dưới thời hạn lớp cơ sở của chúng thay vì thông qua nhu cầu chính hãng để thực hiện dọn dẹp cơ bản. Nếu bạn tình cờ khởi tạo và làm việc với đối tượng hoàn toàn theo một phương pháp, hãy gói nó trong một khối sử dụng để thêm một chút bất tiện. Nhưng nếu đối tượng dài hơn, hãy giữ bản nhạc khi nó không còn được sử dụng để bạn có thể vứt bỏ nó thêm sự phức tạp không cần thiết. Trong những trường hợp như vậy, bạn có thể đơn giản bỏ qua việc xử lý đối tượng .

tl; dr: không, bạn không cần phải vứt bỏ.

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