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

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

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

나는 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.