Console.WriteLine () 및 너무 많은 인수 오버로드가 필요합니까?


87

설명서를 살펴보면서 Console.WriteLine()메서드에 여러 오버로드가 있음을 알았 습니다. 특히 저의 호기심과 부분적인 혼란은 다음과 관련이 있습니다.

public static void WriteLine(string format, params object[] arg);
public static void WriteLine(string format, object arg0);
public static void WriteLine(string format, object arg0, object arg1);
public static void WriteLine(string format, object arg0, object arg1, object arg2);
public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3);

중복 된 것 같습니다. 첫 번째 과부하 외에 다른 4 개의 과부하가 필요한 것은 무엇입니까? 첫 번째 방법은 다른 방법이 할 수있는 모든 것을 할 수 있습니다. 최대 4 개의 인수 (마지막 인수)를 처리하는 추가 오버로드를 제공하여 해결하려는 성능 문제가 있습니까? 최대 4 개의 인수 배열을 통과하는 오버 헤드가 이러한 오버로드에 대한 요구를 충족 할만큼 충분히 큰가요?

답변:


102

일반적으로 첫 번째 과부하가 다른 과부하에 충분할 수 있다는 것이 맞습니다. 그러나 params메서드 그룹 바인딩과 같은 간접적 인 경우에는 키워드를 사용할 수 없기 때문에 이것은 엄격하게 사실이 아닙니다 . 예를 들면

delegate void E(string format, object o1);
E e = Console.WriteLine;

params특정 과부하가 존재할 때 과부하에만 작동이 경우 만족하지 않을

public static void WriteLine(string format, object arg0);

그래도 꽤 난해한 경우입니다. 더 중요한 이유는 다음과 같습니다.

  1. params키워드 를 지원하는 데 모든 CLI 언어가 필요한 것은 아닙니다 . 오버로드가 있으면 간단한 WriteLine` 호출을 위해 배열을 수동으로 생성 할 필요가 없으므로 해당 언어에 대한 부담이 줄어 듭니다.
  2. 공연. params오버로드를 호출하면 컴파일러에 의해 암시 적으로 수행 된 경우에도 호출자가 배열을 할당해야합니다. 할당은 .Net에서 저렴하지만 무료는 아닙니다. 이와 같은 작은 것들은 특히 Console.WriteLine. 다른 과부하가 있으면 일반적인 경우에 이러한 할당을 피할 수 있습니다.

1
내 대답에서 메서드 그룹 사례에 대해 생각했지만 메서드 그룹 변환은 C # 2.0까지 도입되지 않았고 WriteLine 오버로드는 최소 1.1로 거슬러 올라갑니다.
— jaket 2014 년

@jaket 편리한 구문이 C # 2.0에 추가되었습니다. 그러나 new E(Console.WriteLine)C # 1에서 명시
— 적을

5
Console.WriteLine이 얼마나 느린 지 배열 할당이 눈에 띄나요?
— Bryan Boettcher 2014 년

3
@insta 그것은 속도가 아니라 문제인 할당의 축적입니다. GC는 무료가 아니라 저렴하며 복잡한 앱에서 GC는 종종 성능을 지배하는 요소입니다. 불필요한 할당의 일반적인 소스를 중지하면 성능이 중요하다
— JaredPar

38

오버로드는 params 키워드가 존재하지 않는 C ++ / CLI 프로그램의 편의를위한 것입니다.


1
IMHO라는 훌륭한 질문에 대한 훌륭한 답변입니다.
— 우베 KEIM

1
아 ... 그거 정말 말이 되네요. 부끄러워요, C ++는 제 모국어였습니다. :)
— BK

3
첫 번째 언어, 영리한 대답 친구의 기본 시작
— DBW

4

여러분 모두는 C # 2.0에서 params가 도입되었다는 사실을 잊고 있다고 생각합니다. 따라서 params 키워드가없는 경우 .NET 1.1에서도 오버로드가 발생합니다.


jaket이 언급했습니다.
— BK

JaredPar의 답변에 대한 그의 의견을 읽으십시오. 이것이 그가 대답에 매개 변수 설명을 포함하지 않은 이유 중 하나입니다.
— BK

@Noobacode, 그가 한 것은 사실이지만 (내가 읽는 방법대로) 추론되었습니다. 나는 Alan이 더 직접적인 장원에서 그것을 언급했기 때문에 여기에서 Alan에게 upvote (그만한 가치가있는 한)를줍니다.
— Frank V

1
이로부터 링크 PARAMS는 닷넷 1.1에 존재 키워드
— 스리 람 Sakthivel

1

나는 질문에 이미 JaredPar 와 jaket 의 훌륭하고 설명적인 답변이 있다고 생각하지만 내가 생각하는 것 역시 관련이 있다고 생각합니다.

사용자 가 필요에 따라 위의 기능을 사용 하기 쉽고 자유로울 수 있다고 생각합니다 . 실제로 필요하지 않을 때 배열을 생성하도록 부과하는 것보다 훨씬 더 편리합니다.

나는 C #을 배우기 시작했을 때도 배열을 거의 사용하지 않았고 배열 을 사용하는 것은 나에게 복잡한 작업이라고 생각합니다.


3
그러나 아이디어 params는 배열을 전달하거나 모든 인수를 명시 적으로 작성할 수 있다는 것입니다. 같은 메서드 void do(params object[])는 do(new object[] {"some", "stuff"}또는로 호출 할 수 있습니다 do("some", "stuff"). 나는 당신의 요점이 여기에 정확히 적용될 것이라고 생각하지 않습니다.
— Kroltan 2014 년

2
@Kroltan 그러나 얼마나 많은 초보자가 실제로 의미를 params알고 있는지 알 params수 있으며 변수가 있는지 쉼표로 구분하여 전달할 수 있습니다.
— dbw 2014 년

1
@Kroltan 나도 params오랫동안 이렇게 될 수 있다는 것을 몰랐고 Visual Studion에 표시된 도움말 섹션에서 array []인수로 가져 오면 배열을 인수로 제공하는 것과 동일하다고 생각합니다 ....
— dbw

-3

이것은 실제로 성능 문제가 아닙니다. 그러나 유용성을 높이는 것이 그 타당한 이유입니다.

아래 코드는 작은 통찰력을 제공합니다.

public class TipCalculator {
    private const double tipRate = 0.18;
    public static int Main(string[] args) {
        double billTotal;
        if (args.Length == 0) {
            Console.WriteLine("usage: TIPCALC total");
            return 1;
        }
        else {
            try {
                billTotal = Double.Parse(args[0]);
            }
            catch(FormatException) {
                Console.WriteLine("usage: TIPCALC total");
                return 1;
            }
            double tip = billTotal * tipRate;
            Console.WriteLine();
            Console.WriteLine("Bill total:\t{0,8:c}", billTotal);
            Console.WriteLine("Tip total/rate:\t{0,8:c} ({1:p1})", tip, tipRate);
            Console.WriteLine(("").PadRight(24, '-'));
            Console.WriteLine("Grand total:\t{0,8:c}", billTotal + tip);
            return 0;
        }
    }
}

자세한 내용은 http://msdn.microsoft.com/en-us/library/aa324774(v=vs.71).aspx 링크 를 참조하십시오.


9
이것이 유용성을 어떻게 증가시킬까요? 첫 번째 방법은 다른 네 가지 방법과 똑같은 일을 할 수 있습니다. 당신은 저를 문서에 대해 언급하고있는 반면, 제가 문서를 살펴보고 있다고 말했습니다. 나는 그 방법이 무엇에 사용되고 어떻게 사용되는지 알고 있습니다 (저는 C #에 익숙하지 않습니다). 그러나 첫 번째 것 위에 추가 과부하가 필요한 이유는 무엇입니까?
— BK

그가 의미하는 바는 하나의 매개 변수 만 전달하기 때문에 배열을 생성하여 메소드에 전달할 필요가 없다는 것입니다. 하나의 매개 변수 만 전달하지 않는 이유는 무엇입니까? 즉 그 같은 일을 내 이유가 될 것입니다
— KingTravisG

@ SCassidy1986 : 당신은 당신이 원하는 않는 한이하는 PARAMS 방법 때 배열을하지 않습니다. 컴파일러는 자동으로 하나를 만듭니다. 이것이 params와이 질문의 요점입니다.
— Magus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.