그 점과 목록이나 배열을받는 메소드를 만드는 것의 차이점은 무엇입니까?
차이점
void M(params int[] x)
과
void N(int[] x)
M이 다음과 같이 호출 될 수 있다는 것입니다.
M(1, 2, 3)
또는 이와 같이 :
M(new int[] { 1, 2, 3 });
그러나 N은 첫 번째 방법이 아닌 두 번째 방법으로 만 호출 될 수 있습니다 .
아마도 성능에 영향을 줄 수 있습니까?
성능에 미치는 영향 M
은 첫 번째 방식으로 호출하든 두 번째 방식으로 호출하든 배열을 생성하는 방식입니다. 어레이를 만들면 시간과 메모리가 모두 필요하므로 성능에 영향을줍니다. 성능 영향은 성능 목표와 비교하여 측정해야합니다. 추가 어레이를 생성하는 비용이 시장에서의 성공과 실패의 차이 인 게이팅 요소 일 가능성은 낮습니다.
나는 당신이 무제한 매개 변수를 가진 것을 선호하는 방식을 완전히 이해하거나 보지 못합니다.
메소드를 호출하는 코드 작성자에게는 순수하고 전적으로 편리합니다. 그것은 단순히 짧고 쉽게 쓰기에
M(1, 2, 3);
글쓰기 대신
M(new int[] { 1, 2, 3 });
발신자 측에서 몇 번의 키 입력 만 저장하면됩니다. 그게 다야
묻지 않았지만 다음에 대한 답을 알고 싶은 몇 가지 질문이 있습니다.
이 기능은 무엇입니까?
호출자 측에 가변 개수의 인수를 전달할 수있는 메소드를 variadic 이라고 합니다 . Params 메소드는 C #이 가변 방식을 구현하는 방법입니다.
다양한 방법으로 과부하 해결이 어떻게 작동합니까?
오버로드 해결 문제가 발생하면 C #은 "정상"및 "확장"형식을 모두 고려하고, 해당되는 경우 "정상"형식이 항상 우선합니다. 예를 들어 다음을 고려하십시오.
void P(params object[] x){}
우리는 전화를
P(null);
적용 가능한 두 가지 가능성이 있습니다. "정상적인"형식 P
에서 배열에 대한 null 참조를 호출 하고 전달합니다. "확장 된"형태로을 호출 P(new object[] { null })
합니다. 이 경우 정상적인 형태가 이깁니다. 우리가 전화를 P(null, null)
했다면 일반 양식은 적용 할 수 없으며 기본적으로 확장 양식이 승리합니다.
도전 과제 : var s = new[] { "hello" };
전화를 했다고 가정 해 봅시다 P(s);
. 콜 사이트에서 어떤 일이 발생하는지 그리고 그 이유를 설명하십시오. 당신은 놀라게 될 것입니다!
도전 과제 : void P(object x){}
와 void P(params object[] x){}
. 무엇을 P(null)
하고 왜?
도전 과제 : void M(string x){}
와 void M(params string[] x){}
. 무엇을 M(null)
하고 왜? 이것이 이전 사례와 어떻게 다릅니 까?