를 호출시에 예외를 던져 I가 IEnumerable<whatever>
을 반환하고 yield return myWhatever
구조를 통해 그렇게 내가 상속 한 방법 :포스 수율 복귀 방법은
public IEnumberable<whatever> GetWhatevers() {
while (true) {
// do calculations
yield return myWhatever
}
}
내가 루프이 원인이되는 버그를 발견 클래스의 컬렉션 중 하나가 null 무한히 경우, 그래서 나는 수표를 추가하고 테스트 썼다 : (나는 결코 실제로 내가 메소드를 호출해도 결과를 반복하는 시작하기 때문에이 테스트가 실패로 인해
public IEnumberable<whatever> GetWhatevers() {
if (_dependentList == null || _dependentList.Count == 0) {
throw new InvalidOperationException("Unable to process without whatevers");
}
while (true) {
// do calculations
yield return myWhatever
}
}
void MyWhateverThrowsIOEOnEmptyList() {
var sut = new MyThing(null);
Assert.ThrowsException<InvalidOperationException>(() => {
var results = sut.GetWhatevers();
});
}
지금 실현을에구조).
void MyWhateverThrowsIOEOnEmptyList() {
var sut = new MyThing(null);
Assert.ThrowsException<InvalidOperationException>(() => {
var results = sut.GetWhatevers().ToList();
});
}
을 ...하지만 난 그것을 좋아하지 않아 :
나는이 일을하여 테스트를 해결할 수 있습니다. 즉, 호출자가이 메서드를 호출 할 때마다 내부에 IOE가 숨겨져 있다는 결과가 액세스 될 때까지 알 수 없습니다. 이 결과 변수는 Timbucktu로 되돌아 갈 수 있으며, 시간 폭탄이라는 것을 전혀 모르는 채로 되돌아 갈 수 있습니다.
이제이 방법을 사용할 때마다 그 안에 숨어있을 수있는 예외가 있음을 기억해야합니다.
이 방법은 기존 루프를 사용하여 다시 작성하려는 경우 너무 복잡합니다. 문제가 있다고 부를 때 알 수 있도록 "해결 시간"대신 "호출 시간"에 예외가 발생하도록 강제 할 수있는 방법이 있습니까?
(이 추한 약간의 부작용이 ... yield''의 장점 가치가하지 않는 것) – jleach
당신은'에서'항복 return' 코드를 넣을 수 있습니다 private GetWhateversInternal()'을 호출하고,'GetWhatevers()'를 체크하여'return GetWhateversInternal();'를 호출합니다. –
반복기를 사용하는 것이 유용한 것은 하나뿐입니다. 그들은 그것을 반복 할 것입니다. ToList() 또는 foreach를 사용하든 MoveNext()를 호출하든 관계없이 모든 비트는 동일합니다. –