2010-03-31 3 views
6

System.Array은 CLR (Common Language Runtime)의 모든 배열에 대한 기본 클래스로 사용됩니다. this article에 따르면 Get/Set/Address 각 콘크리트 어레이 형은.NET의 다차원 System.Array 인스턴스에 대한 Get, Set 및 Address 메서드에 대한 정보는 어디에서 찾을 수 있습니까?

[] 런타임 세 특별한 방법을 추가한다.

그리고 실제로 나는이 C# 코드, 내가 할 CIL에

int[,] x = new int[1024,1024]; 
x[0,0] = 1; 
x[1,1] = 2; 
x[2,2] = 3; 
Console.WriteLine(x[0,0]); 
Console.WriteLine(x[1,1]); 
Console.WriteLine(x[2,2]); 

, 상기 GetSet 방법에 대한 호출이 명확하게 볼 수 있습니다

IL_0000: ldc.i4  0x400 
IL_0005: ldc.i4  0x400 
IL_000a: newobj  instance void int32[0...,0...]::.ctor(int32, 
                 int32) 
IL_000f: stloc.0 
IL_0010: ldloc.0 
IL_0011: ldc.i4.0 
IL_0012: ldc.i4.0 
IL_0013: ldc.i4.1 
IL_0014: call  instance void int32[0...,0...]::Set(int32, 
                 int32, 
                 int32) 
IL_0019: ldloc.0 
IL_001a: ldc.i4.1 
IL_001b: ldc.i4.1 
IL_001c: ldc.i4.2 
IL_001d: call  instance void int32[0...,0...]::Set(int32, 
                 int32, 
                 int32) 
IL_0022: ldloc.0 
IL_0023: ldc.i4.2 
IL_0024: ldc.i4.2 
IL_0025: ldc.i4.3 
IL_0026: call  instance void int32[0...,0...]::Set(int32, 
                 int32, 
                 int32) 
IL_002b: ldloc.0 
IL_002c: ldc.i4.0 
IL_002d: ldc.i4.0 
IL_002e: call  instance int32 int32[0...,0...]::Get(int32, 
                 int32) 
IL_0033: call  void [mscorlib]System.Console::WriteLine(int32) 
IL_0038: ldloc.0 
IL_0039: ldc.i4.1 
IL_003a: ldc.i4.1 
IL_003b: call  instance int32 int32[0...,0...]::Get(int32, 
                 int32) 
IL_0040: call  void [mscorlib]System.Console::WriteLine(int32) 
IL_0045: ldloc.0 
IL_0046: ldc.i4.2 
IL_0047: ldc.i4.2 
IL_0048: call  instance int32 int32[0...,0...]::Get(int32, 
                 int32) 
IL_004d: call  void [mscorlib]System.Console::WriteLine(int32) 

를 분해합니다. 이러한 방법의 장점은 배열의 차원과 관련이있는 것으로 보이는데, 이는 아마도 런타임에서 만들어지고 미리 선언되지 않은 이유 일 것입니다. MSDN에서 이러한 메서드에 대한 정보를 찾을 수 없으며 단순한 이름으로 인해 인터넷 검색이 어려워졌습니다. 다차원 배열을 지원하는 언어 용 컴파일러를 작성 중이므로이 메서드에 대한 공식 문서를 찾고 싶습니다. 어떤 조건에서이 메서드가 존재할 것으로 예상되는지, 그리고 해당 서명이 무엇인지 기대할 수 있습니다.

는 특히, 나는 반영하기에 올바른 유형과 차원을 가진 배열의인스턴스를 만들 필요없이 Reflection.Emit에 사용 Get 또는 Set에 대한 MethodInfo 객체를 얻기 위해 가능 여부를 알고 싶습니다 연결된 예에서와 같이

+0

@Rob : 'Address' 메소드에 대한 예제가 있습니까? 그리고이 방법들이 생성된다는 사실을 설명하는 링크가 있습니까? –

+0

@ 존 - 내 첫 단락에서 '이 기사'링크를 클릭하면 두 번째 단락의 견적을 가져 오는 기사에서 끝납니다. –

답변

5

봐, 페이지 63 ~ 65

http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS%20Partition%20II.pdf 그러나 테이크 아웃, 당신은 IL에서 알 수에 특별히 섹션 14.2, 그들은 배열 처리를위한 getter와 setter 메소드를 걸이다 주어진 인덱스 위치에서. INT32 인수 배열의 각 차원에 대한 하나의 시퀀스를 받아, 그 형 배열의 요소 타입 인 값을 반환 get 메소드 •

. 이 메서드는 배열 의 인 인덱스 으로 시작하여 이 반환되는 각 차원에 인덱스를 지정하는 배열 의 특정 요소에 이 액세스하는 데 사용됩니다. 그 값을 입력 다음 INT32 인수 배열의 각 차원에 대한 하나의 시퀀스 걸리는 설정 방법 •

은, 배열의 요소 유형 이다. 반환 유형 집합 은 무효입니다.이 방법을 설정할 수있는 요소들, 제 인수가 로 시작 으로 각각의 사이즈 인덱스를 지정 어레이의 특정 요소를 설정하는 데 사용되며 최종 인수 내로 저장 될 수있는 값을 지정 타겟 요소. 를 들어, 배열의 각 차원을 한 INT32 인수 순서를 받아, 배열의 요소 유형에 대한 관리되는 포인터 인 반환 유형이 주소 방법 •

. 이 방법 인수가 각 차원에 인덱스 지정 위치를 그 주소를 리턴하는 요소의 첫 번째와 을 시작하는 어레이의 특정 요소 관리 포인터를 리턴하는 데 사용된다.

편집 : 페이지의 번호 매기기는 63-65 페이지입니다. 실제 PDF에서는 73-75입니다.

+0

우수! 그게 바로 제가 찾던 것입니다. 고맙습니다. –

1

매우 구체적인 질문은 다루 겠지만 확실하지는 않지만 주제에 대한 훌륭한 텍스트는 CLR via C#입니다. 관심있는 많은 주제에 대해 매우 심도 깊고 배열을 포함한 많은 기본 .NET 유형의 내부 동작을 살펴 보는 디스어셈블러와 함께 많은 시간을 보냅니다. 체크 아웃할만한 가치가있어. 여기

+0

C#을 통해 CLR을 살펴 보도록하겠습니다. 여기에 나와 있습니다. 13 장 : 배열을 읽었지만 Get, Set 및 Address 메서드에 대해서는 언급 할 수 없습니다. –

2

두 번째 질문에 대답하려면이 메서드에 MethodInfo을 얻기 위해 인스턴스를 만들 필요가 없습니다.

var mi = typeof(string).MakeArrayType(6).GetMethod("Get"); 

같은 뭔가가 string[,,,,,] 유형에 대한 Get 방법을 얻을 작동합니다.

+0

Splendid! 이제 나는 내가 가진 모든 것을 얻었습니다. –

+1

나는 MakeArrayType의 과부하 중에서 선택할 때주의가 필요하다는 것을 발견했다. 인수가없는 경우 - MakeArrayType()은 string []과 같은 벡터 유형을 만듭니다. 1의 인수로 - MakeArrayType (1)은 string [*] 유형의 한 차원을 갖는 다차원 배열을 만듭니다. 이러한 유형은 호환되지 않습니다. 다른 .NET 언어와의 상호 운용성을 위해 이것은 rank == 1 일 때 매개 변수가없는 메소드에 대한 호출을 특수화해야 할 필요가 있음을 의미합니다. –