ToString을 재정의하는 것이 적절한 이유 / 언제?


103

저는 C #을 연구 중이며 ToString아래 예제와 같이 재정의의 요점과 이점이 무엇인지 궁금 합니다.

재정의없이 일반적인 방법을 사용하여 더 간단한 방법으로 수행 할 수 있습니까?

public string GetToStringItemsHeadings
{
    get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); }
}


public override string ToString()
{
    string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal);
    return strOut;
}

4
실제로 UI에 개체를 표시하는 데 실제로 사용 하려는지 여부에 따라 다르며, 그렇지 않으면 일반적으로 디버깅을위한 것입니다. VS의 감시 창에 ToString 출력이 표시됩니다. (그러나 클래스의 속성을 사용하여이를 달성 할 수도 있습니다.) 제목과 출력이 주어지면이 프로그램이 Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);또는 이와 유사한 것을 사용하여 객체를 덤프하는 데 사용하는 것처럼 보입니다 .
Rup

2
나는 그 질문을 정말로 이해하지 못한다. 다르게 할 수 있습니까? 예. 하지만 왜 다르게 하고 싶 습니까?
Konrad Rudolph

5
저는 GetToString부동산 이름을 건너 뛰고 싶습니다. 그러면 예를 들면 다음과 같습니다Console.WriteLine(obj.ItemHeadings)
Svish

"this"가 필요하지 않으므로 ItemHeadings 속성을 정적으로 변경합니다.
eFloh

이 질문을 확인하실 수 있습니다 : stackoverflow.com/questions/7906828/oo-design-advice-tostring
Yuri Ghensev

답변:


127
  • 재정의해야 ToString합니까? 아니.

  • 다른 방법으로 객체의 문자열 표현을 얻을 수 있습니까? 예.

그러나 사용함으로써 ToString당신은 모든 객체에 공통적 인 방법을 사용 하고 있으므로 다른 클래스는이 방법에 대해 알고 있습니다. 예를 들어, .NET 프레임 워크가 객체를 문자열 표현으로 변환하려고 할 때마다는 ToString주요 후보입니다 (더 정교한 서식 옵션을 제공하려는 경우 다른 항목도 있음).

구체적으로

Console.WriteLine(yourObject);

호출 yourObject.ToString()합니다.


13
예. 여기서 또한이 MVC 또는 ASP.Net 개발에 매우 유용 @yourObject하고 <%=yourObject%>"ToString-ED"가 될 것입니다.
Ben Lesh 2012

4
콤보 상자를 채울 때 또한, ToString는 항목 텍스트를 얻을 수있는 기본 호출입니다
다비 Fiamenghi

3
그러한 관행을 조심하십시오. 실화 : 한 학생이 문자열을 반환하는 것 외에 데이터를 변경하는 방법으로 ToString을 덮어 썼습니다. 그는 프로그램을 디버깅하고 있었지만 프로그램이 중단 점에 서있는 동안 값은 계속 변경되었습니다. 분명히-그가 ToString 값을 확인할 때마다 프로그램이 실행 중이 아니더라도 값이 변경되었습니다.
JNF

3
@JNF "그런 연습"이란 무엇입니까? ToString실제로 개체의 상태를 변경해서는 안됩니다. 그러나 이것은 내가 옹호 한 것이 아닙니다.
Konrad Rudolph

8
@JNF 나는 그것을 받아들이지 않는다. ToString되는 의미 오버라이드 (override) 할 수 있습니다. 기간. 이 진술에주의를 기울이는 것은 생산적이지 않습니다. 당신이 잘못하면-당신 자신의 잘못입니다. 사실, 귀하의 학생 ToString은 David Anderson의 답변에 게시 된 재정의에 대한 공식 지침 목록에서 4 번을 위반했습니다 .
Konrad Rudolph

129

.NET 개발 시리즈 의 프레임 워크 디자인 지침 에서 바로 답을 드리려고합니다 .

예외를 던지지 마십시오.ToString

인스턴스와 관련된 고유 한 문자열을 반환하는 것을 고려 하십시오.

출력 ToString이이 유형의 모든 구문 분석 방법에 대해 유효한 입력 이 되도록 고려 하십시오 .

눈에ToString 띄는 부작용이 없는지 확인하십시오 .

DO의 보고서의 재정의를 통해 보안에 민감한 정보를 ToString적절한 권한을 요구 한 후에 만. 권한 요구가 실패하면 보안에 민감한 정보를 제외한 문자열을 반환합니다.

Object.ToString메서드는 일반적인 표시 및 디버깅 목적으로 사용됩니다. 기본 구현은 단순히 객체 유형 이름을 제공합니다. 기본 구현은 그다지 유용하지 않으며 메서드를 재정의하는 것이 좋습니다.

DO의 재정 ToString재미있는 사람이 읽을 수있는 문자열이 반환 할 수 있습니다 때마다. 기본 구현은 그다지 유용하지 않으며 사용자 정의 구현은 거의 항상 더 많은 가치를 제공 할 수 있습니다.

DO는 고유하지만 읽을 수있는 ID를 통해 친숙한 이름을 선호합니다.

Chris Sells ToString가 종종 사용자 인터페이스에 위험한 지침에서 설명하므로 언급 할 가치가 있습니다. 일반적으로 내 경험 법칙은 정보를 UI에 바인딩하는 데 사용되는 속성을 노출 ToString하고 개발자에게 진단 정보를 표시하기위한 재정의를 남겨 두는 것입니다. 당신의 타입을 꾸밀 수도 있습니다 DebuggerDisplayAttribute.

DO는 반환 된 문자열을 유지하려고 ToString짧은. 디버거는 ToString개발자에게 표시 할 개체의 텍스트 표현을 가져 오는 데 사용 합니다. 문자열이 디버거가 표시 할 수있는 것보다 길면 디버깅 환경이 방해를받습니다.

문화권 종속 정보를 반환 할 때 현재 스레드 문화권을 기반으로하는 DO 문자열 형식 지정.

DO는 과부하 제공 ToString(string format), 또는 구현 IFormattable에서 문자열을 반환하는 경우, ToString문화를 구분하거나 문자열을 포맷하는 다양한 방법이 있습니다. 예를 들어, DateTime오버로드를 제공하고 IFormattable.

빈 문자열 또는 null을 반환 하지 마십시오.ToString

이 지침에 따라 맹세합니다. 그렇게해야합니다. .NET에 대한이 가이드 라인만으로 내 코드가 어떻게 개선되었는지 말할 수 없습니다 ToString. 같은 일이 같은 것들에 간다 IEquatable(Of T)하고 IComparable(Of T). 이러한 것들은 여러분의 코드를 매우 기능적으로 만들며, 코드를 구현하는 데 추가 시간을 투자 한 것을 후회하지 않을 것입니다.

개인적으로 저는 사용자 인터페이스에 대해 ToString 많이 사용하지 않았고 , 항상 어떤 종류의 속성이나 메서드를 노출 해 왔습니다. 대부분의 경우 ToString디버깅 및 개발자 목적으로 사용해야 합니다. 중요한 진단 정보를 표시하는 데 사용합니다.


6
좋은 대답입니다. msdn.microsoft.com/en-us/library/ms229042.aspx 를 참조하는 지침 입니까?
Jodrell

2
나는 그것이에서 가져온 믿을 @Jodrell 프레임 워크 디자인 가이드 라인
짐 슈베르트을

6
더 나은 인용이 필요합니다.
Ben Voigt 2012

13
SO가 Wikipedia로 바뀌는 줄 몰랐습니다.
데이비드 앤더슨

14
그렇지는 않지만 지침을 인용 할 때 출처를 제공하는 것은 부정 할 수없는 장점입니다.
Falanwe 2012

39

재정의 ToString()하면 사람이 읽을 수있는 유용한 클래스의 문자열 표현을 제공 할 수 있습니다.

이는 출력이 클래스에 대한 유용한 정보를 나타낼 수 있음을 의미합니다. 예를 들어, Person 클래스가 있다면 ToString()그 사람의 ID, 이름, 성 등을 출력 하도록 선택할 수 있습니다 . 이것은 디버깅 또는 로깅시 매우 유용합니다.

귀하의 예제와 관련하여-이 클래스가 무엇인지 모르고 재정의가 유용한 지 여부를 말하기는 어렵지만 구현 자체는 괜찮습니다.


13

항상 적절하지만 표시하려는 의도를 신중하게 고려하십시오.

더 나은 질문은 다음과 같이 묻는 것입니다.

왜 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 () 역사상 가장 가치 있고 잘 사용되지 않는 메서드 중 하나

두 가지 이유가 있습니다.

  1. 사람들은 ToString ()이 무엇인지 이해하지 못합니다.
  2. 기본 '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 가이 답변을 반대 투표하기 위해 약간의 트롤 미끼를 뿌렸습니다.


당신은 "이것을 핵심에서 구현하는 언어를 아직 보지 못했습니다"라고 썼습니다. 파이썬이 이것에 매우 근접한 것 같습니다. 예를 들어 배열을 인쇄하면 모든 데이터가 간결하게 제공됩니다. C # / Java에서 내가 놓친 한 가지는 엄격함을 좋아하지만. 그리고 ToString ()을 넘어서야 할 때 파이썬의 목록 이해 구문과 같은 것을 갖는 것이 좋을 것입니다. 나는 string.Join ()이 비슷하지만 덜 유연하다고 생각합니다.
Jon Coombs

1
@JCoombs 동의하지 않습니다, 이해력이 좋습니다. 이해력을 통해 파이썬에서 데이터 구조를 탐색하는 것은 삶을 훨씬 더 쉽게 만들어 주지만 그 접근 방식은 여전히 ​​객체의 내부 구조에 대한 친밀한 지식이 필요합니다. 외부 라이브러리에서 가져온 클래스에서는 항상 명확하지 않은 것입니다. 라이브러리 작성자가 ToString ()을 재정의하고 사람이 읽을 수있는 유용한 표현을 제공하는 것이 좋지만 객체의 구조를 일반적인 구조화 된 사람이 읽을 수있는 형식 (예 : JSON)으로 출력하는 일반적인 덤프 메서드를 사용하는 것도 좋습니다.
Evan Plaice 2013-09-26

훌륭한 지적입니다. 따라서 기본적으로 typeof 만 표시하는 대신 JSON과 같은 것으로 자동 직렬화 할 수 있습니다. (지금까지 XML로 직렬화 된 .NET 객체 만 보았지만 .NET을 처음 접했습니다)하지만 위험은 ToString ()을 기계가 읽을 수있는 것으로 취급하려는 유혹 일 수 있습니다. (예를 역 직렬화 할 수있을 것으로 기대합니다.)
존 쿰즈에게

1
@JCoombs Yep, 기능 수준에서 JSON 및 XML은 동일한 목적을 제공합니다. 많은 사람들이 ToString을 기계가 읽을 수있는 출력으로 사용합니다. 그것이 나쁜지 아닌지는 논쟁의 여지가 있습니다. 내 가장 큰 장점은 종종 사람이 읽을 수있는 형식으로 개체의 상태를 출력하는 것이 고통 스럽다는 것입니다. ToString () 구현은 종종 활용도가 낮으며 디버거 감시 목록 외부에서 객체의 상태를 읽는 것은 고통 스럽습니다. 직렬화 된 표현은 객체 전체 상태를 표시하기위한 백업으로 좋지만 ToString의 더 나은 구현이 가장 좋은 옵션입니다.
Evan Plaice 2013-09-27

경우 ToString()중요한 기능 - 디버깅을위한 것입니다, 왜 그것은 모두 StringBuilder에서 전체 텍스트를 추출 할 수있는 유일한 방법이다?
Dan W

9

정말 좋은 습관에 관한 것입니다.

ToString()일반적으로 사람이 소비하기 위해 객체의 문자열 표현을 반환하기 위해 여러 곳에서 사용됩니다. 동일한 문자열 객체를 재수하는 데 사용할 수있는 자주 (생각 int또는 DateTime예를 들어)하지만, 단순히 카운트를 표시하는 유용한 캐릭터 라인 표현이있을 수 있습니다 항상 예를 들어 주어진 (나무 아니지만 분명 당신은 사용할 수 없습니다 그것을 재건하는 것).

특히 디버거는 이것을 사용하여 조사 식 창, 즉각적인 창 등에 변수를 표시하므로 ToString실제로 디버깅에 매우 유용합니다.

일반적으로 이러한 유형에는 종종 문자열도 반환하는 명시 적 멤버가 있습니다. 예를 들어 위도 / 경도 쌍에는 예를 들어 ToDecimalDegrees반환 되는 위도 / 경도 쌍이있을 수 "-10, 50"있지만 ToDegreesMinutesSeconds위도 / 경도 쌍에 대한 또 다른 형식이므로을 가질 수도 있습니다 . 그런 다음 동일한 유형이ToString 디버깅과 같은 항목 또는 잠재적으로 웹 페이지 렌더링과 같은 항목에 '기본값'을 제공하기 위해 해당 중 하나로 (예 : @Razor 의 구문은 ToString()문자열이 아닌 표현식 의 결과를 출력 스트림).


6

object.ToString()객체를 문자열 표현으로 변환합니다. 사용자 ToString()가 생성 한 클래스를 호출 할 때 반환되는 내용을 변경하려면 ToString()해당 클래스에서 재정의해야합니다 .


6

가장 유용한 정보가 이미 제공되었다고 생각하지만 2 센트를 추가하겠습니다.

  • ToString()재정의를 의미합니다. 기본 구현은 때때로 유용 할 수 있지만 (특히 많은 객체로 작업 할 때) 대부분의 경우 충분하지 않은 유형 이름을 반환합니다.

  • 디버깅 목적으로 DebuggerDisplayAttribute. 여기에서 자세한 내용을 읽을 수 있습니다 .

  • 원칙적으로 POCO에서는 항상 ToString(). POCO는 데이터의 구조화 된 표현이며 일반적으로 문자열이 될 수 있습니다.

  • 개체의 텍스트 표현이되도록 ToString을 디자인합니다. 주요 필드 및 데이터, 컬렉션에있는 항목 수에 대한 설명 등이 될 수 있습니다.

  • 항상 해당 문자열을 한 줄에 맞추고 필수 정보 만 가지고 있어야합니다. Person이름, 주소, 번호 등 속성 이있는 클래스 가있는 경우 기본 데이터 만 반환합니다 (이름 일부 ID 번호).

  • 의 좋은 구현을 재정의하지 않도록주의하십시오 ToString(). 일부 프레임 워크 클래스는 이미 ToString(). 기본 구현을 재정의하는 것은 나쁜 일입니다. 사람들은 특정 결과를 기대하고 ToString()또 다른 결과를 얻습니다.

사용하는 것을 정말로 두려워하지 마십시오 ToString(). 내가 조심해야 할 유일한 것은 민감한 정보를 반환하는 것입니다. 그 외에는 위험이 최소화됩니다. 물론 일부가 지적했듯이 다른 클래스는 정보를 얻을 때마다 ToString을 사용합니다. 그러나 도대체 언제 유형 이름을 반환하는 것이 실제 정보를 얻는 것보다 더 나은 것으로 간주됩니까?


5

재정의하지 않으면 ToString기본 클래스 구현을 얻을 수 있습니다.Object 의 짧은 유형 이름 인 .

다른 더 의미 있거나 유용한 구현을 ToString원한다면 재정의하십시오.


A에 대한 데이터 소스와 같은 유형의 목록을 사용할 때 유용 할 수 있습니다 ListBox는 다음과 같이 ToString자동으로 표시됩니다.

유형 의 표현을 가져 오기 위해 String.Format호출 ToString하는 유형을 전달하려는 경우 또 다른 상황이 발생합니다 .


4

다른 사람이 아직 언급하지 않은 사항 :을 재정 의하여 다음을 수행 할 수 있도록 ToString()구현을 고려할 수도 IFormattable있습니다.

 public override ToString() {
   return string.Format("{0,-20} {1, -20}", m_work, m_personal);
 }

 public ToString(string formatter) {
   string formattedEmail = this.ToString();
   switch (formatter.ToLower()) {
     case "w":
       formattedEmail = m_Work;
       break;
     case "p":
       formattedEmail = m_Personal;
       break;
     case "hw":
       formattedEmail = string.Format("mailto:{0}", m_Work);
       break;
   }
   return formattedEmail;
}

유용 할 수 있습니다.


재정의 할 해당 메서드를 제공하는 프레임 워크 클래스의 예를 들어 주시겠습니까? 프레임 워크에서 내가 아는 유일한 관련 항목은 IFormattible인터페이스입니다.
tm1

@ tm1에서 상속하는 모든 객체 System.Object는 재정의 가능한 ToString()메서드를 갖지만 포맷터 메서드가 완전한 적합성을 위해 인터페이스를 override참조해서는 안되며 실제로 참조해야 한다는 것은 맞습니다 IFormattible.
Zhaph-Ben Duguid

거의 - IFormattable합니다 IFormatProvider매개 변수. 그래도 게시물을 수정 해 주셔서 감사합니다.
tm1

실제로, 두 가지 방법이 있습니다. 제가 표현한 값은 표시된 것입니다.)
Zhaph-Ben Duguid


2

어떤 경우에는 디버거 조사 식 창에서 사용자 정의 클래스의 값을 더 쉽게 읽을 수 있습니다. 조사 식 창에서보고 싶은 내용을 정확히 알고 있다면 해당 정보로 ToString을 재정의하면 표시됩니다.


1

구조체 (효과적으로 사용자 프리미티브)를 정의 할 때 특히 XML 직렬화에 대해 ToString, 및 ParseTryParse메서드를 일치시키는 것이 좋습니다 . 이 경우 전체 상태를 문자열로 변환하여 나중에 읽을 수 있습니다.

그러나 클래스는 일반적으로 ToString및 을 사용하기에는 너무 복잡한 복합 구조입니다 Parse. 그들의 ToString방법은 대신 전체 상태를 저장, 당신은 이름이나 ID, 또는 어쩌면 목록의 수량과 같은 고유 식별자처럼, 자신의 상태를 식별하는 데 도움이 간단한 설명이 될 수 있습니다.

또한 Robbie가 말했듯이 재정의를 ToString사용하면 ToString참조를 기본 형식으로 호출 할 수 있습니다 object.


1

사람처럼 문자열 표현의 직관적 인 의미가없는 객체가있을 때 사용할 수 있습니다. 예를 들어이 사람을 인쇄해야하는 경우이 재정의를 사용하여 형식을 준비 할 수 있습니다.


1

Object.ToString메서드는 디버깅 목적으로 만 사용해야합니다. 기본 구현은 그다지 유용하지 않은 객체 유형 이름을 보여줍니다. 진단 및 디버깅을위한 더 나은 정보를 제공하려면이 메서드를 재정의하는 것이 좋습니다. 로깅 인프라는 종종 ToString 메서드도 사용하므로 로그 파일에서 이러한 텍스트 조각을 찾을 수 있습니다.

Object.ToString메서드 내에서 지역화 된 텍스트 리소스를 반환 하지 마십시오 . 그 이유는 ToString 메서드가 항상 개발자가 이해할 수있는 것을 반환해야하기 때문입니다. 개발자는 응용 프로그램이 지원하는 모든 언어를 사용하지 못할 수 있습니다.

IFormattable사용자에게 친숙한 현지화 된 텍스트를 반환하려는 경우 인터페이스를 구현 합니다 . 이 인터페이스는 format및 매개 변수를 사용하여 ToString 오버로드를 정의합니다 formatProvider. formatProvider는 문화 인식 방식으로 텍스트 서식을 지정하는 데 도움이됩니다.

참고 항목 : Object.ToString 및 IFormattable


0

귀하의 자산이 어떻게 사용되는지에 따라 더 간단합니다. 문자열의 형식을 한 번만 지정해야한다면 재정의하는 것이 그다지 의미가 없습니다.

그러나 속성에 대한 일반 문자열 데이터를 반환하지 않고 표준 서식 패턴을 수행하기 위해 ToString 메서드를 재정의하는 것으로 보입니다. 패딩과 함께 string.format을 사용하고 있기 때문입니다.

학습 중이라고 말씀 하셨기 때문에이 연습은 캡슐화 및 코드 재사용과 관련된 객체 지향 프로그래밍의 핵심 원칙에도 적용되는 것으로 보입니다.

패딩에 대해 설정 한 인수를 사용하는 string.format은 속성을 호출하는 모든 코드에 대해 매번 동일한 방식으로 속성 형식이 지정되도록합니다. 또한 앞으로 여러 곳이 아닌 한 곳에서만 변경하면됩니다.

훌륭한 질문과 훌륭한 답변!


0

특히 어설 션이 실패하면 테스트 콘솔이 개체에 대해 ToString 메서드를 호출 할 때 테스트에서 문제를 빠르게 식별하는 데 도움이되므로 엔터티 클래스에서 ToString 메서드를 재정의하는 것이 유용하다는 것을 알았습니다.

그러나 이전에 말한 것과 일치하여 문제의 대상에 대한 사람이 읽을 수있는 표현을 제공합니다.


0

다른 답변에 언급 된 프레임 워크 지침에 만족합니다. 그러나 디스플레이 및 디버깅 목적을 강조하고 싶습니다.

ToString코드에서 사용하는 방법에주의하십시오 . 코드는 객체의 문자열 표현에 의존해서는 안됩니다. 그렇다면 각 Parse방법을 절대적으로 제공해야 합니다.

ToString어디에서나 사용할 수 있기 때문에 나중에 객체의 문자열 표현을 변경하려는 경우 유지 관리 문제가 될 수 있습니다. 이 경우 일부 코드가 중단되는지 여부를 연구하기 위해 호출 계층 구조를 검사 할 수는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.