항상 적절하지만 표시하려는 의도를 신중하게 고려하십시오.
더 나은 질문은 다음과 같이 묻는 것입니다.
왜 ToString ()을 재정의합니까?
ToString ()은 객체의 상태에 대한 창입니다. 상태 를 요구 사항으로 강조 합니다. Java / C #과 같은 강력한 OOP 언어는 클래스의 모든 것을 캡슐화하여 OOP 모델을 남용합니다. 강력한 OOP 모델을 따르지 않는 언어로 코딩하고 있다고 상상해보십시오. 클래스를 사용할 것인지 함수를 사용할 것인지 고려하십시오. 이를 함수 (예 : 동사, 액션)로 사용하고 내부 상태가 입력 / 출력 사이에 일시적으로 만 유지된다면 ToString ()은 값을 추가하지 않습니다.
다른 사람들이 언급했듯이 디버거 나 다른 시스템에서 사용할 수 있으므로 ToString ()으로 출력하는 내용 을 고려 하는 것이 중요 합니다.
ToString 메서드를 개체의 --help 매개 변수로 상상하고 싶습니다. 짧고, 읽기 쉽고, 명확하고, 표시하기 쉬워야합니다. 이 객체가 무엇인지 표시해야 입니다 그렇지 않은 것을 않습니다 . 모든 것을 염두에두고 고려해 봅시다 ...
사용 사례-TCP 패킷 구문 분석 :
애플리케이션 수준 전용 네트워크 캡처가 아니라 pcap 캡처와 같은 더 많은 기능이있는 것입니다.
TCP 레이어에 대해서만 ToString ()을 오버로드하여 콘솔에 데이터를 인쇄 할 수 있습니다. 무엇이 포함됩니까? 미쳐서 모든 TCP 세부 정보를 구문 분석 할 수 있습니다 (즉, TCP는 복잡합니다) ...
다음을 포함합니다.
- 소스 포트
- 목적지 포트
- 시퀀스 번호
- 승인 번호
- 데이터 오프셋
- 플래그
- 창 오프셋
- 체크섬
- 긴급 포인터
- 옵션 (I은 아니에요 심지어 거기에 갈)
하지만 100 개의 패킷에 대해 TCP.ToString ()을 호출한다면 그 모든 정크를 받고 싶습니까? 물론 정보 과부하가 될 것입니다. 쉽고 분명한 선택도 가장 현명한 선택입니다 ...
사람들이보기를 기대하는 것을 노출 :
나는 인간이 파싱하기 쉬운 합리적인 출력을 선호하지만 YMMV .
TCP:[destination:000, source:000]
복잡한 것은 없습니다. 출력은 기계가 파싱하는 것이 아닙니다 (즉, 사람들이 코드를 남용하지 않는 한). 의도 된 목적은 사람이 쉽게 읽을 수 있도록하는 것입니다.
하지만 이전에 얘기했던 나머지 모든 정보는 어떻습니까? 그렇게 유용하지 않습니까? 그것에 대해 설명하겠습니다.하지만 먼저 ...
ToString () 역사상 가장 가치 있고 잘 사용되지 않는 메서드 중 하나
두 가지 이유가 있습니다.
- 사람들은 ToString ()이 무엇인지 이해하지 못합니다.
- 기본 'Object'클래스에 똑같이 중요한 다른 문자열 메서드가 없습니다.
이유 1-ToString ()의 유용성을 남용하지 마십시오.
많은 사람들이 ToString ()을 사용하여 객체의 간단한 문자열 표현을 가져옵니다. C # 설명서에는 다음과 같은 내용도 있습니다.
ToString은 .NET Framework의 주요 서식 지정 방법입니다. 디스플레이에 적합하도록 객체를 문자열 표현으로 변환합니다.
추가 처리가 아닌 표시 . 즉, 위의 TCP 패킷의 멋진 문자열 표현을 가져와 정규식 :: cringe ::를 사용하여 소스 포트를 가져옵니다.
작업을 수행 하는 올바른 방법은 SourcePort 속성에서 직접 ToString ()을 호출하는 것입니다 (BTW는 ushort이므로 ToString ()이 이미 사용 가능해야 함).
머신 파싱을 위해 복잡한 객체의 상태를 패키징하기 위해 더 강력한 것이 필요하다면 구조화 된 직렬화 전략을 사용하는 것이 좋습니다.
다행히도 이러한 전략은 매우 일반적입니다.
- ISerializable (C #)
- Pickle (Python)
- JSON (Javascript 또는이를 구현하는 모든 언어)
- 비누
- 기타...
참고 : PHP를 사용하지 않는 한 herp-derp에는 :: snicker ::에 대한 함수가 있습니다.
이유 2-ToString ()이 충분하지 않습니다.
나는 아직 이것을 핵심으로 구현하는 언어를 보지 못했지만이 접근 방식의 변형을보고 사용했습니다.
그중 일부는 다음과 같습니다.
- ToVerboseString ()
- ToString (verbose = true)
기본적으로, TCP 패킷의 상태 가 너무 복잡해서 사람이 쉽게 읽을 수 있도록 설명 해야 합니다. TCP에 대해 말하는 '죽은 말을 이길'을 피하기 위해 ToString () 및 ToVerboseString ()이 제대로 활용되지 않는다고 생각하는 # 1 사례에서 '손가락을 가리 킵니다'.
사용 사례-어레이 :
주로 한 언어를 사용하는 경우 해당 언어의 접근 방식에 익숙 할 것입니다. 저와 같이 다른 언어로 넘어가는 사람들에게는 다양한 접근 방식이 짜증날 수 있습니다.
즉, 이것이 나를 짜증나게 한 횟수는 모든 힌두교 신의 모든 손가락을 합친 것보다 큽니다.
있습니다 다양한 언어가 일반적인 사용의 경우 해킹을 하고 몇 그 수 를 오른쪽으로 . 일부는 바퀴의 재창조가 필요하고, 일부는 얕은 덤프를, 다른 일부는 깊은 덤프를 수행하며, 어느 것도 내가 원하는 방식으로 작동하지 않습니다.
내가 요청한 것은 매우 간단한 접근 방식입니다.
print(array.ToString());
출력 : 'Array [x]'또는 'Array [x] [y]'
여기서 x는 첫 번째 차원의 항목 수이고 y는 두 번째 차원의 항목 수이거나 두 번째 차원이 들쭉날쭉하다는 것을 나타내는 값입니다 (최소 / 최대 범위는?).
과:
print(array.ToVerboseString());
예쁜 것을 고맙게 생각하기 때문에 전체를 예쁜 글씨로 출력합니다.
바라건대, 이것은 오랫동안 나를 짜증나게 한 주제에 대해 약간의 빛을 비추어줍니다. 최소한 나는 PHPers 가이 답변을 반대 투표하기 위해 약간의 트롤 미끼를 뿌렸습니다.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
또는 이와 유사한 것을 사용하여 객체를 덤프하는 데 사용하는 것처럼 보입니다 .