C # 메서드가 사용하도록 정의 할 수있는 최대 매개 변수 수는 얼마입니까?
C #의 메서드가 가질 수있는 최대 매개 변수 수를 알아 내려고합니다. C # 공식 문서, MSDN 및 몇 가지 CLR 참조를 포함하여 모든 곳에서 답변을 확인했지만 답변을 찾을 수 없습니다. 이 질문에 대한 답이있는 사람이 있습니까?
이론적 대답은 다음과 같습니다.
메서드 인수를 스택에 푸시하기 위해 컴파일 된 코드에는 선택할 수있는 다음과 같은 MSIL opcode가 있습니다.
ldarg.0
ldarg.1
ldarg.2
ldarg.3
ldarg.S
ldarg
ldarg.0
to ldarg.3
는 처음 4 개의 메서드 인수를 스택에 푸시하는 데 사용됩니다 ( this
인스턴스 메서드의 첫 번째 인수 포함 ).
ldarg.S
8 비트 인수 번호를 취하므로 최대 256 개의 인수를 스택에 푸시하는 데 사용할 수 있습니다.
ldarg
대부분의 메서드 인수를 처리 할 수 있는 일반 old를 남깁니다 . 부호없는 16 비트 인수 번호를 사용합니다. 따라서 유효한 MSIL로 성공적으로 컴파일 할 수있는 가장 많은 인수는 2^16 = 65,536
.
그러나 다른 사람들이 언급했듯이 시스템의 플랫폼 / 아키텍처에 따라 실제로 메서드를 실행하려고 할 때 적용되는 다양한 실제 스택 크기 제한이 있습니다. rmiesen의 답변에 따르면 현재 .NET 구현은 런타임시 스택의 최대 크기를 2^14
.
메소드에 전달할 수있는 최대 매개 변수 수를 결정하는 프로그램을 작성하기 위해 일회용 프로그램을 사용했습니다. 내 실험 결과에 따르면 내가 찾을 수있는 가장 가까운 답은 다음과 같습니다 (모두 내 컴퓨터에서만 유효 함).
- 16383 매개 변수가있는 메소드를 포함하는 .net 애플리케이션은 컴파일, 실행 및 호출 (!)
- 16384 개 이상의 매개 변수를 포함하는 .net 애플리케이션을 컴파일 할 수 있지만 이러한 프로그램을 실행하면 명시되지 않은 예외가 발생합니다.
- 50000 매개 변수를 포함하는 .net 애플리케이션도 컴파일 할 수 있지만 이러한 애플리케이션을 실행하려고하면 StackOverflowException이 발생합니다.
- 100000 개 이상의 매개 변수가 포함 된 .net 응용 프로그램을 컴파일하려고하면 csc.exe에서 컴파일 타임 오류가 발생하여 결과식이 처리하기에 너무 길거나 복잡하다는 내용이 표시됩니다.
그 외에도 누구든지이 질문에 대한 확실한 답을 가지고 있습니까?
추신 : 누군가 자신의 컴퓨터에서이 실험을 시도하고 싶다면 https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0에서 다운로드 할 수있는 내 테스트 프로그램으로 시작할 수 있습니다.
'program tip' 카테고리의 다른 글
예외 Junit 4.10 후 Mockito 확인 (0) | 2020.11.25 |
---|---|
knockoutjs-로드시 트리거되는 매개 변수가있는 바인딩 (0) | 2020.11.24 |
WebStorm에서 Wordwrap을 설정할 수 있습니까? (0) | 2020.11.24 |
Swift에서 'fileprivate'키워드는 무엇을 의미합니까? (0) | 2020.11.24 |
http 헤더에서 파일 크기를 얻는 방법 (0) | 2020.11.24 |