2010-03-19 3 views

답변

5

매번 빈 StringWriter가 필요한 특정 함수가있는 경우 해당 함수에서 새 StringWriter를 만듭니 까?

원래 질문으로 돌아가서 .NET Reflector을 사용하여 StringWriter의 Dispose가 무엇인지 확인했습니다. 그것이하는 모든 것은 기본 클래스 '(TextWriter) Dispose로 되돌아 오는 것입니다. 아무 것도하지 않습니다.

당신이 정말로 드러내고있는 StringWriter를 "재사용"해야한다면, 필요할 때 새로운 인스턴스를 다시 만드는 것이 안전 할 것 같습니다 (디자인을 재고해야한다고 생각하기는하지만 말입니다). StringWriter를 클래스의 public 멤버로 노출).

+0

공개적이라고 말한 적은 없습니다. 그것은 콜백에 대한 필요와 내가 can not 문자열 쓰기에 전달하므로 회원입니다. –

11

다른 답변자에 동의합니다. 클래스 레벨 문자열 작성자가 실제로 갈 길이 있는지 확인하려면 디자인을 봐야합니다.

그러나, 나는

에 대한 점에 동의하지 않는다 "는 않는 모든 폐기 다시 기본 클래스 '(TextWriter에)로 호출입니다 -. 을 아무것도하지 않는 한"

유형을 사용하는 경우 유형이 Dispose 인 경우 명시 적으로 또는 "사용"으로 호출해야합니다.

이 경우 StringWriter.Dispose은 아무 것도 수행하지 않는 TextWriter.Dispose으로 전화를 걸지만 실제로는 "무시하는"것이 좋습니다.

상속 및 다형성의 전체적인 포인트는이 유형을 파생 유형에 대해 스왑 아웃 할 수 있다는 것입니다.

코드에서 오늘의 StringWriterDispose에 대해 더 의미있는 구현을 할 수있는 내일의 EvenBetterStringWriter으로 바뀔 수 있습니다.

Dispose을 구현하고이를 사용하는 경우 수행이 끝나면 dispose를 호출해야합니다.

이 특정 구체화의 내부에 대한 특권있는 지식은 여러분이 이처럼 여러분의 디자인을 안내하게 할 때 위험합니다. StringWriter 클래스 작성자는 Dispose가 호출되도록 분명히 의미했거나 존재하지 않을 것입니다. 요컨대 오라일리의 C#에서

+0

+1. 그래서 당신은 매번 새로운 문자열 작성자를 처리하고 작성해야한다고 제안합니까? 기존의 것을 비울 수있는 방법이 없습니까? (또는 아마도 이점이 없다) –

+0

재사용 접근법의 문제점은 고려해야 할 다른 문제가 있다는 것입니다. 1MB 문자열을 작성한 후 2KB로 다시 사용하면 나머지 1022KB는 거기에서 자유가 없거나 가비지 콜렉션에 대해 알 수 있습니까? 이것은 단지 하나의 예입니다. 전반적으로 - 아마 매번 생성 경로를 따라 가면서 특정 성능 문제가있는 경우에만 걱정할 것입니다. –

+1

"StringWriter 클래스의 작성자는 Dispose가 호출되도록 분명히 의미했거나 존재하지 않을 것입니다." - 음 ... 아니. StringWriter는보다 일반적인 TextWriter에서 파생되기 때문에 Dispose가 있습니다. – mrec

0

:

있다, 그러나, 폐기하지 않는 세 가지 시나리오 :

  • ...
  • ...
  • 객체의 폐기 방법은 디자인에 의해 불필요하고, 그 객체를 폐기하는 프로그램 세 번째 범주는 다음과 같은 클래스가 포함

에 복잡성을 추가합니다 : 에 (웹 클라이언트, StringReader를, 문자열 작가 및 BackgroundWorker에를 System.ComponentModel). 이 유형은 필수 정리를 수행해야하는 진정한 필요성보다는 기본 클래스 인 의 일종으로 처분됩니다. 그러한 객체를 인스턴스화하고 하나의 메소드로 완전히 작업하는 경우 사용 블록에 배치하면 에 약간의 불편 함이 추가됩니다. 그러나 객체가 오래 지속되면 트랙은 더 이상 사용되지 않으므로 처리 할 수 ​​없으므로 불필요한 복잡성이 추가됩니다 ( ). 이 경우 객체 처분을 무시하면됩니다.

tl; dr : 아니요, 처리 할 필요가 없습니다.

관련 문제