무제한의 매개 변수를 사용하는 메소드가 종종 더 적은 매개 변수로 과부하를 정의하는 이유는 무엇입니까?


36

예를 들어 System.IO.Path.Combine.NET 의 메서드에는 다음과 같은 오버로드가 있습니다.

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

마지막 세 가지의 요점은 무엇입니까?

첫 번째 params키워드 는 키워드를 사용하여 자세히 살펴 보는 것처럼 모든 것을 다룹니다 . 이전 버전과의 호환성에 대한 논쟁은 Combine(String, String)변형이 .NET 4까지의 유일한 버전 이었기 때문에 변형에만 적용됩니다.

답변:


56

주된 이유는 성능 때문입니다. "무제한 인수"구문 설탕은 실제로 문자열 배열입니다. 하나의 문자열 만 전달하는 경우 하나의 문자열로 배열을 만드는 이유는 무엇입니까? 특히이 메소드 호출의 ~ 90 %가 3 개 이하의 인수를 사용하는 경우 더 무거운 가중치 배열 오브젝트가 필요하지 않습니다. 메소드를 정의하기 위해 루프가 필요하지 않기 때문에 메모리가 약간 가벼우 며 처리 시간이 조금 더 걸립니다. 세 개의 문자열이 있으면 세 개의 문자열 만 코딩하면됩니다.


주목해야 할 또 다른 사항은 Combine0 개 또는 1 개의 경로 세그먼트 를 전달 하는 것도 의미가 없지만 params버전을 사용하면 가능합니다.
Matthew

4
다른 수의 인수를 허용 하는 과부하 수의 이유 는 읽기 쉬운 것이 아닙니다. 문자열 배열을 생성 한 다음 처리하여 발생하는 오버 헤드로 인해 성능이 향상됩니다. 수락하는 이유 params string[]는 가독성 때문입니다.
Greg Burghardt

2
성능은 실제로 그 이유이며, 내부 루프에서 함수가 호출 될 때 특히 그렇습니다 . C # 프로그래밍 언어의 p.27에 대한 Brad Abrams의 주석으로서 , Third Edition 은 다음과 같이 말합니다. 비효율적 일 수있는 루프 형 시나리오의 경우 주류 사례에 과부하를 제공 params하고 에지 사례에만 과부하를 사용하는 것이 좋습니다 . 예를 들어 StringBuilder.AppendFormat()과부하 제품군입니다. "
Eliah Kagan

3
@LowFlyingPelican Mono와 .NET Framework는 동일하지 않습니다. .NET Framework 버전 을 보면 실제로 다른 솔루션입니다.
Alex

3
@LowFlyingPelican : .NET 프레임 워크의 이유 성능입니다. 이 방법을 구현 한 모노의 이유는 .NET과의 API 호환성 때문이었습니다. 그 방법으로 그 방법을 구현 한 모노의 이유는 구현의 단순성 때문이었습니다 (마이크로 소프트보다 리소스가 훨씬 적기 때문입니다).
jhominal

4

구문 설탕.

파일 경로를 조작 할 때 적은 수의 고정 값을 갖는 것이 일반적입니다. 이 경우 배열로 패키지화하지 않고 직접 사용하는 것이 더 편리합니다.


3
매개 변수를 사용하면 이미 문제를 해결하고 있습니다. msdn.microsoft.com/ko-kr/library/w5zay9db.aspx 어레이가 필요 없습니다.
토마스 정크

3
C #에서는 @Thomas라는 요점이 있습니다. 그러나 .NET은 params.
Karl Bielefeldt

@ThomasJunk 불행히도 그 링크는 죽었지 만 C #이 평범하기 때문에 당신이 옳습니다. 나는 더 깨끗한 코드를 허용하기 위해 많은 언어를 가진 많은 라이브러리를 보았습니다.
로봇 고트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.