2009-10-05 3 views
0

; 바람직합니다. 넷 4? 그것은 굴복 된 for-loop입니까? 사용자 정의 구현 (IEnumerable, IEnumerator) 또는?Enumerable.Range 구현 닷넷에서 Enumerable.Range의 <em>정확한</em> 구현이 무엇

+5

왜 신경 씁니까? –

+2

리플렉터를 사용하여 디 컴파일하기 http://www.red-gate.com/products/reflector/ –

+0

내가 이것을 신경 쓰는 이유는 구현이 얼마나 효율적이며 내 구현을 어떻게 만드는지 알고 싶기 때문입니다. 예를 들면 Int64 및 무엇을 가지고 있습니다. –

답변

1

에게이 questionaccepted answer하는 당신에게 답변을 제공해야합니다 : 등 검사 Range 메서드 내에서 계속 오류가 많은이있는 한이의 정확한 코드가 아닙니다

public static class Enumerable { 
    public static IEnumerable<int> Range(int start, int count) { 
     var end = start + count; 
     for(var current = start; current < end; ++current) { 
      yield return current; 
     } 
    } 
} 

및 내부적으로 다른 메서드를 호출하지만 위의 인용 된 코드는 Range 루틴의 "본질"입니다.

Reflector의 코드를 검사하는 것은 훨씬 더 많은 정보를 제공해야합니다.

+0

나는 본질을 원하지 않았고 정확한 대답을 원했습니다. 그러나 라이센스 제한으로 인해 이것이 가능하지 않다는 점에 감사드립니다. 의견을 보내 주셔서 감사합니다. 이제 반사경을 사용하여 답변을 찾았습니다. –

+0

더 좋아.'if (! valid) throw exception; 그렇지 않으면'RangeInternal'이 반복자 인 RangeInternal (...);을 반환합니다. 이것은 중요한 구분입니다. 왜냐하면 잘못된 인수를 사용하여'Range'를 호출하면 즉시 예외가 발생할 것이기 때문입니다. 'Range' 메쏘드가'yield '를 직접적으로 사용했다면 컬렉션을 foreach 할 때까지 예외를 얻지 못했습니다. –

+0

@Mehrdad - 반복 자체와 같이 지연이 아니라 예외가 (잠재적으로) 던져지는 것이 아주 좋은 지적입니다. 내가 오류 검사에 대해 언급했을 때 언급 한 내용이긴하지만 더 명확하게 설명했습니다. – CraigTP

1

Reflector을 사용하면 직접 구현을 볼 수 있습니다. 호출 할 때 인수를 검사하고 예외를 throw하므로 Range 메서드 자체가 반복기 메서드가 아닙니다. iterator 메소드 인 또 다른 메소드를 호출합니다. license restrictions으로 인해 정확한 코드를 게시하는 것은 문제가되지 않습니다.

1

반사경 출력에 약간 있지만 유의 한 차이 (뿐만 아니라 인수 확인 및 CraigTP의 답변과 의견에 언급 내면화의 추가 레벨) :

, 대신 다른 지역 변수이다
public static IEnumerable<int> Range(int start, int count) { 
    for(int current = 0; current < count; ++current) { 
     yield return start + current; 
    } 
} 

, 그들은 모든 수익률을 위해 추가 추가를 적용합니다.