2012-12-11 4 views
31

이 코드가 어떻게 다음 출력을 생성하는지 설명하는 사람이 있습니까? 선택적 매개 변수와메서드 재정의 및 선택적 매개 변수

using System; 

namespace ConsoleApplication1 
{ 
    class Test 
    { 
     public override string ToString() { return "ToString override"; } 
     public string ToString(string optional = "") 
      { return String.Format("ToString with optional parameter {0}", optional); } 
    } 

    class Test2 
    { 
     public new string ToString() { return "ToString new"; } 
     public string ToString(string optional = "") 
      { return String.Format("ToString with optional parameter {0}", optional); } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test one = new Test(); 
      Test2 two = new Test2(); 
      Console.WriteLine(one); 
      Console.WriteLine(one.ToString()); 
      Console.WriteLine(one.ToString("foo")); 
      Console.WriteLine("--"); 
      Console.WriteLine(two); 
      Console.WriteLine(two.ToString()); 
      Console.WriteLine(two.ToString("bar")); 
      Console.ReadKey(); 
     } 
    } 
} 

의 toString 오버라이드

ToString 선택적 매개 변수 foo에와

ToString

-

ConsoleApplication1.Test2

Console.WriteLine (일)

이는 WriteLine(object)를 사용합니다 : 일반적으로 흥미가 거기로, 여기에 빠른 버전입니다,

+3

어떤 라인을 이해하지 못합니까? (그것들 모두에 대해 자세하게 설명하는 것이 지루할 것이다.) –

+0

기본적으로 컴파일러는 서로 다른 서명을 가지고 있기 때문에 서로 다른 방법을 선택한다. – pneuma08

+1

그들은 동일한 서명을 가지고 있지 않습니다 ... 그리고 다시 말하면, 당신이 붙어있는 줄을 말할 때 도움이 될 것입니다. 과부하 해결 방법을 이해하려고 얼마나 노력 했습니까? 그런데 C# 4.5와 같은 것은 없습니다. –

답변

49

좋아 선택적 매개 변수 줄 새로운

ToString을 ToString 오버로드는 object.ToString() 가상 메소드를 실행하고 One에 오버라이드되므로 ToString override

의 출력

Console.WriteLine (one.ToString())

One보고 방법 새로 선언 방법가 한 볼 - 할인 재정의를. 적용 할 수있는 하나의 메소드가 있습니다 - 선택적 매개 변수가있는 메소드. 따라서이 값은 기본값을 사용하여 실행되어 ToString with optional parameter의 결과로 이어집니다.

Console.WriteLine (one.ToString ("foo는")) 다시 같은

하지만, 컴파일러는 디폴트 값을 사용할 필요가없는이 시간, 따라서 ToString with optional parameter foo

콘솔. WriteLine (두)

다시 말하지만, 이것은 WriteLine(object)에서 가상 object.ToString() 메서드를 호출합니다. 이 메서드는 오버라이드되지 않으므로 유형 이름을 반환하는 기본 구현이 사용되며 결과는 ConsoleApplication1.Test2입니다.

는 Console.WriteLine는 (two.ToString())

컴파일러 하지 오버라이드 가상 메소드는 어떤 Two에서 선언 된 모든 방법을 보인다. 이 경우 두 가지 방법, 즉 매개 변수없는 매개 변수와 선택적 매개 변수가있는 매개 변수가 있습니다. 기본 클래스 메서드를 재정의하는 것이 아니라 이기 때문에 매개 변수없는 값이 포함됩니다.

컴파일러는 선택적 매개 변수를 채울 필요가없는 메서드를 호출하기 때문에 매개 변수없는 메서드는 "더 나은"후보로 간주됩니다.따라서 출력 ToString new

Console.WriteLine (two.ToString ("바"))

을 다시 컴파일러 Two에서 선언 된 모든 방법에서 보인다하지 오버라이드 가상 메소드이다. 이 경우 두 가지 방법이 있지만 매개 변수가없는 매개 변수는 적용 할 수 없으므로 매개 변수가없는 매개 변수는 옵션 매개 변수로 남겨 둡니다. 어쨌든 인수를 가지고 같이 컴파일러, 사용 여기에 선택적 매개 변수의 기본값으로 필요하지 않습니다 ... 그래서 출력이 더 많은이에 대한 ToString with optional parameter bar

이다, C# 언어 사양을 읽고 - 또는 중간 집에 대해서는 내 article on overloading을 참조하십시오.

+3

실제로 지루하고 유익하지만 작성해 주셔서 감사합니다. –

+0

좋은 물건 Jon (평소와 같이). 나는 천천히 그것을 모두 밖으로 일하는 것에 둥글게되고 있었다. 주된 잠재적 인 놀람 점은 그것이 객체에 대한'ToString'가 아니라'object.ToString()'을 사용한다는 것입니다. 사실 그것은 상속 된 메소드에 새로 정의 된 메소드를 선호한다는 사실입니다. – Chris

+71

좋은 사람 Jon Skeet : "그들 모두에 대해 자세하게 설명하는 것이 지루할 것"이라고 말하면서 그들 모두에 대해 자세하게 설명합니다. – Rawling