program tip

C # 메서드가 사용하도록 정의 할 수있는 최대 매개 변수 수는 얼마입니까?

radiobox 2020. 11. 24. 07:52
반응형

C # 메서드가 사용하도록 정의 할 수있는 최대 매개 변수 수는 얼마입니까?


C #의 메서드가 가질 수있는 최대 매개 변수 수를 알아 내려고합니다. C # 공식 문서, MSDN 및 몇 가지 CLR 참조를 포함하여 모든 곳에서 답변을 확인했지만 답변을 찾을 수 없습니다. 이 질문에 대한 답이있는 사람이 있습니까?


이론적 대답은 다음과 같습니다.

메서드 인수를 스택에 푸시하기 위해 컴파일 된 코드에는 선택할 수있는 다음과 같은 MSIL opcode가 있습니다.

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

ldarg.0to ldarg.3는 처음 4 개의 메서드 인수를 스택에 푸시하는 데 사용됩니다 ( this인스턴스 메서드의 첫 번째 인수 포함 ).

ldarg.S 8 비트 인수 번호를 취하므로 최대 256 개의 인수를 스택에 푸시하는 데 사용할 수 있습니다.

ldarg대부분의 메서드 인수를 처리 할 수 있는 일반 old를 남깁니다 . 부호없는 16 비트 인수 번호를 사용합니다. 따라서 유효한 MSIL로 성공적으로 컴파일 할 수있는 가장 많은 인수는 2^16 = 65,536.

그러나 다른 사람들이 언급했듯이 시스템의 플랫폼 / 아키텍처에 따라 실제로 메서드를 실행하려고 할 때 적용되는 다양한 실제 스택 크기 제한이 있습니다. rmiesen의 답변에 따르면 현재 .NET 구현은 런타임시 스택의 최대 크기를 2^14.


메소드에 전달할 수있는 최대 매개 변수 수를 결정하는 프로그램을 작성하기 위해 일회용 프로그램을 사용했습니다. 내 실험 결과에 따르면 내가 찾을 수있는 가장 가까운 답은 다음과 같습니다 (모두 내 컴퓨터에서만 유효 함).

  1. 16383 매개 변수가있는 메소드를 포함하는 .net 애플리케이션은 컴파일, 실행 및 호출 (!)
  2. 16384 개 이상의 매개 변수를 포함하는 .net 애플리케이션을 컴파일 할 수 있지만 이러한 프로그램을 실행하면 명시되지 않은 예외가 발생합니다.
  3. 50000 매개 변수를 포함하는 .net 애플리케이션도 컴파일 할 수 있지만 이러한 애플리케이션을 실행하려고하면 StackOverflowException이 발생합니다.
  4. 100000 개 이상의 매개 변수가 포함 된 .net 응용 프로그램을 컴파일하려고하면 csc.exe에서 컴파일 타임 오류가 발생하여 결과식이 처리하기에 너무 길거나 복잡하다는 내용이 표시됩니다.

그 외에도 누구든지이 질문에 대한 확실한 답을 가지고 있습니까?

추신 : 누군가 자신의 컴퓨터에서이 실험을 시도하고 싶다면 https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0에서 다운로드 할 수있는 내 테스트 프로그램으로 시작할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/12658883/what-is-the-maximum-number-of-parameters-that-ac-sharp-method-can-be-defined-as

반응형