문제

문제는 다음과 같습니다.

  • GUI 라이브러리는 사용하는 것을 좋아합니다 ToString 클래스의 기본 표현으로. 그곳에서 현지화되어야합니다.
  • ToString 로깅에 사용됩니다. 그곳에서 프로그래밍 관련 정보를 제공해야하며 번역되지 않으며 대리 키 및 열거 값과 같은 내부 상태를 포함합니다.
  • ToString 예를 들어 객체를 인수로 취하는 많은 문자열 작업에서 사용합니다. String.Format, 스트림에 쓸 때. 상황에 따라 다른 것을 기대합니다.
  • ToString 동일한 객체의 여러 가지 표현이있는 경우 너무 제한적입니다. 길고 짧은 형태.

다른 사용으로 인해 다양한 종류의 구현이 있습니다. 그래서 그들은 너무 신뢰할 수 없어서 정말 유용하지 않습니다.

어떻게해야합니다 ToString 유용하기 위해 구현 되나요? 언제 ToString 언제 피해야합니까?


그만큼 .NET 프레임 워크 문서 말 :

이 방법은 문화에 민감한 사람으로 읽을 수있는 문자열을 반환합니다.

이있다 비슷한 질문, 그러나 동일하지는 않습니다.

도움이 되었습니까?

해결책

작은 방법으로부터 큰 기대를 가지고있는 것 같습니다. :) 행동이 수업마다 다를 수있을 때 특히 많은 다른 상황에서 일반적인 방법을 사용하는 것이 좋지 않다는 것을 알고 있습니다.

내 제안은 다음과 같습니다.

1. GUI 라이브러리가 객체의 tostring ()을 사용하지 않도록하십시오. 2. 객체에 대한 정보를 얻을 때 (로깅 또는 기타 사용법) 누군가가 제공해야 할 사항과 표시 방법을 결정하게하십시오. (전략 패턴이 유용 할 수 있음)

다른 팁

다음은 설명하는 멋진 기사입니다 재정의 System.Object.toString () 및 IforMattable 구현

그것은 당신의 클래스의 유출 사용에 따라 다릅니다. 많은 클래스에는 자연스러운 문자열 표현이 없습니다 (예 : 양식 객체). 그런 다음 디버깅 할 때 유익한 방법 (양식 텍스트, 크기 등)으로 Tostring을 구현했습니다. 클래스가 사용자에게 정보를 제공하기위한 경우 값의 기본 표현으로 Tostring을 구현합니다. 예를 들어 벡터 객체가있는 경우 Tostring은 벡터를 x 및 y 좌표로 반환 할 수 있습니다. 여기에 수업을 설명하는 다른 방법이 있다면 대체 방법을 추가합니다. 따라서 벡터의 경우 설명을 각도와 lenght로 리턴하는 메소드를 추가 할 수 있습니다.

디버깅 목적으로 DebuggerDisplay 속성을 클래스에 추가 할 수도 있습니다. 이것은 디버거에 클래스를 표시하는 방법을 알려주하지만 문자열 표현에는 영향을 미치지 않습니다.

문자열 표현에서 객체를 만들 수 있도록 Tostring에 의해 반환 된 값을 변형 가능하게 만드는 것을 고려할 수도 있습니다. int32.parse 메소드로 할 수있는 것처럼.

고려해야 할 또 다른 주름은 Tostring과 Visual Studio의 디버거 사이의 엄격한 통합입니다. 시계 창은 표현식의 값으로 Tostring의 결과를 표시하므로 방법이 게으른로드를 수행하거나 부작용이 있거나 오랜 시간이 걸리면 이상한 동작이 표시되거나 디버거가 매달려있는 것처럼 보일 수 있습니다. . 물론, 이러한 특성은 잘 설계된 Tostring 방법의 표식이 아니지만, 순진한 ""데이터베이스에서 번역을 가져 오는 "구현).

결과적으로, 기본 Tostring 메소드 (매개 변수가없는)는 비주얼 스튜디오 디버깅 후크라고 생각합니다. 디버깅 컨텍스트 외부의 프로그램에서 사용하기 위해 일반적으로 과부하되어서는 안된다는 의미가 있습니다.

알고있는 사람들은 디버깅 속성 (DebuggerTypeproxyAttribute, DebuggerDisplayTribute, DebuggerBrowsableattribute)을 디버거를 사용자 정의하기위한 디버깅 속성 (DebuggerTypeproxyAttribute, DebuggerDisplayTribute, DebuggerBrowsableattribute)을 활용하지만, 많은 (나 자신 포함)는 일반적으로 ToString에 의해 생성되고 Watch Windows에서 표시되는 기본 출력을 충분히 양호하게 고려합니다.

나는 이것이 Tostring을 디버거 훅으로 쓰는 다소 엄격한 관점이라는 것을 이해하지만, iformattable을 구현하는 것이 더 신뢰할 수 있고 확장 가능한 경로 인 것 같습니다.

개인적으로, 나는 자주 Tostring을 구현하지 않습니다. 많은 경우에, 유형의 주요 역할이기 때문에 많은 의미가 없을 것입니다. 5월 데이터가 아니라 동작을 정의해야합니다. 다른 경우에는 고객이 필요하지 않기 때문에 중요하지 않습니다.

어쨌든 여기에는 의미가있는 경우가 있습니다 (철저한 목록이 아님).

  • Tostring의 결과를 생각할 수 있다면 데이터 손실없이 유형의 인스턴스로 다시 구문 분석 할 수 있습니다.
  • 유형이 단순 (예 : 복잡하지 않은) 값을 갖는 경우.
  • 유형의 주요 목적이 데이터를 텍스트로 형식화하는 것입니다.

나는 당신이 나열하는 사용 시나리오 사이에 충돌이 있다는 것에 동의하지 않습니다. 디스플레이가 주요 목적 인 경우, Tostring은 사용자 친화적 인 텍스트를 제공해야하지만, 로깅 (또는 설명대로 추적하기 위해)을 위해 UI 특정 요소를 추적해서는 안된다고 말합니다. 오히려 상세한 추적 데이터를 작성하는 목적이있는 객체입니다.

따라서 단일 책임 원칙에 따라 동일한 유형이 아니기 때문에 충돌은 없습니다.

더 많은 컨트롤이 필요한 경우 항상 Tostring 메소드를 과부하 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top