2009-07-19 7 views
4

일부 매개 변수를 검사해야하는 메서드를 작성하고 유효성 검사를 받으면 IEnumerable을 반환합니다. 예 :명명 된 반복자 및 예외

public static IEnumerable<double> GetEnum(int param) 
{ 
    if (!IsValidParameter(param)) 
    { 
     throw new Exception(); 
    } 

    while(true) 
    { 
     yield return 5.0; 
    } 
} 

그러나 나는 나쁜 매개 변수 내 단위 테스트를 실행할 때, 나는 때문에 게으른 평가의 생각하지만, 아직는 IEnumerable 방법 중 하나를 호출하지 않는, 예외가 발생되지 않습니다.

[Test] 
[ExpectedException(typeof(Exception))] 
void Test() 
{ 
    var ie = GetEnum(bad_param); 
} 

내가 다른 함수 (푸 말), 다음 GetEnum의 매개 변수를 확인하고 푸를 호출하지만 여러 기능을 만들 필요없이 솔루션이의는 IEnumerable을 구축하여 일을 해결할 수 있습니까?

건배, 위르겐

답변

9

인해 반복기 블록을 정의하는 방법에, 현재이를 달성하기 위해 두 가지 방법이 필요합니다

public static IEnumerable<double> GetEnum(int param) { 
    if (!IsValidParameter(param)) { 
     throw new Exception(); 
    } 
    return GetEnumCore(param); 
} 
private static IEnumerable<double> GetEnumCore(int param) { 
    while(true) { 
     yield return 5.0; 
    } 
} 

만 반복자 블록 (GetEnumCore)이 지연됩니다; GetEnum가 즉시 실행되어 검사를 수행합니다.

+0

저는 컴파일러가 두 메서드를 하나의 반복자 블록으로 축소 할만큼 똑똑했는지에 대해 실제로 궁금해했습니다. 팁 주셔서 감사합니다, 마크. –

2

당신은 어쩌면 그냥 기본 열거를 사용하여 반복을 시작할 수 있을까요?

[Test] 
[ExpectedException(typeof(Exception))] 
void Test() 
{ 
    var ie = GetEnum(bad_param); 
    var en = ie.GetEnumerator(); 
    en.MoveNext(); 
} 
+0

열거 자의 이러한 게으른 동작을 이해합니다. 전에 예외를 throw 할 수있는 방법이 있습니까? 명명 된 반복을 위해 생성 된 클래스의 생성자를 말하십니까? – Jurgen

2

시작하지 않으면 메서드가 열거되지 않습니다. 당신은 당신의 시험에 열거 시도 할 수 :

var ie = GetEnum(bad_param).First();