2016-10-31 2 views
-1

UDT (사용자 정의 형식)의 모든 필드를 문자열로 반환하고 싶습니다. 나는이 같은 유형 사용하고자하는 문자열로 반환 된 사용자 정의 형식의 모든 필드를 얻는 방법

public class MyPointF 
{ 
    public float X { get; set; } 
    public float Y { get; set; } 

    public MyPointF(float x, float y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 
} 

:

MyPointF point1 = new MyPointF(10, 20); 
System.Console.WriteLine(point1); 

이 코드의 반환은 다음과 같아야합니다

{10, 20} 

내 UDT 유형은 다음과 같습니다

물론 float 값으로 point1.Xpoint1.Y에 액세스해야합니다. 이 문제를 해결하는 방법에 대한 어떤 힌트라도 좋습니다.

+1

toString를 오버라이드 (override)를() ... –

+0

는 추가 시도가 정확히 그렇게 할 수있는 클래스에 대한 메소드? point1.Print() ...와 같이 호출하면 print 메소드는 원하는대로 문자열을 반환합니다. – relysis

+1

'System.Drawing' 어셈블리를 사용하지 않으려면 적어도'PointF' struct [참조 소스] (https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/PointF.cs)에 구현되어 있습니다. 불변으로 만드는 것이 더 좋을 것이며, 불변 구조로 만드는 것이 더 낫다. 그 외에도 그들은 포인트를 비교하고 더하거나 뺄 수있는 다양한 메소드와 연산자를 구현했습니다. – Groo

답변

2

그래서이처럼 PointF 클래스의 ToString 방법을 override해야합니다

public override string ToString() 
{ 
    return "{ " + X.ToString(CultureInfo.InvariantCulture) + " ," + Y.ToString(CultureInfo.InvariantCulture) + " }"; 
} 
+0

그래, 알아,하지만 방법을 호출하지 않고 그것을 할 수있는 방법이 있습니까? – Nindalf

+0

@DominikAmrein * 사용자 정의 클래스 나 구조체를 생성 할 때 클라이언트 코드에 타입에 대한 정보를 제공하기 위해 ToString 메소드를 오버라이드해야합니다. * ToString을 오버라이드하지 않으면 클래스 이름을 반환합니다. 너는 그것을 인쇄한다. –

+1

@DominikAmrein : System.Console.WriteLine으로 전달할 때 ToString()을 명시 적으로 호출해야하는지 묻는다면, 대답은 * no *입니다.'Console'은 자동으로 메소드를 호출합니다. 객체를 문자열 (예 :' ""+ point1')과 연결할 때마다 자동으로 호출됩니다. 당신이해야 할 일은 클래스 내부의 메소드를 오버라이드하는 것입니다. 이것은 Microsoft의 사람들이 [System.Drawing.PointF' 구조체 (https://referencesource.microsoft.com/#System. 그리기/commonui/시스템/그리기/고급/PointF.cs, 221,284). – Groo

1

이 시도 : PointF의

class Program 
    { 
     static void Main(string[] args) 
     { 

      PointF point1 = new PointF(10, 20); 
      System.Console.WriteLine(point1); 
      Console.Read(); 

     } 


    } 
    public class PointF 
    { 
     public float X { get; set; } 
     public float Y { get; set; } 

     public PointF(float x, float y) 
     { 
      this.X = x; 
      this.Y = y; 
     } 
     public override string ToString() 
     { 
      return "{ " + X.ToString(CultureInfo.InvariantCulture) + " ," + Y.ToString(CultureInfo.InvariantCulture) + " }"; 

     } 
    } 
+0

현재 culture가 소수 구분 기호로 쉼표를 사용하는 경우에는보기 좋지 않지만 Microsoft는 'PointF'구현에서 동일한 작업을 수행합니다. – Groo

+1

글쎄, 나는 단지'CultureInfo.InvariantCulture'를 사용할 것이라고 말하고 있지만, 제 의견입니다. 현재 culture를 사용하는 경우 C# 6 보간 된 문자열, 즉'return $ "{{{X}, {Y}}}"를 사용하여 반환 식을 단순화 할 수 있습니다. 그러나 다시 말하지만, 이것이 "단순화 된"것인지 논쟁의 대상이됩니다. :) – Groo

+0

동의, 변경됨. – James

관련 문제