문제

나는 일반적인 것을 알아 차렸다 IEnumerator<T> idisposable에서 상속하지만 비 게 릭 인터페이스 ienumerator는 그렇지 않습니다. 왜 이런 식으로 설계 되었습니까?

일반적으로, 우리는 foreach 문을 사용하여 IEnumerator<T> 사례. Foreach의 생성 된 코드에는 실제로 Dispose ()를 마지막으로 호출하는 Try-Finally Block이 있습니다.

도움이 되었습니까?

해결책

기본적으로 그것은 감독이었습니다. C# 1.0에서 foreach 절대 ~라고 불리는 Dispose 1. C# 1.2 (VS2003에서 소개 - 1.1, 기괴하게 없음) foreach 체크인하기 시작했습니다 finally 반복자가 구현되었는지 여부를 차단하십시오 IDisposable - 회고 적으로 만들기 때문에 그렇게해야했습니다. IEnumerator 연장하다 IDisposable 모든 사람의 구현을 깨뜨 렸을 것입니다 IEnumerator. 그들이 운동했다면 그것이 유용하다 foreach 처음에 반복자를 처분하려면 확실합니다. IEnumerator 확장되었을 것입니다 IDisposable.

그러나 C# 2.0 및 .NET 2.0이 나왔을 때 새로운 인터페이스, 새로운 상속 인 새로운 기회가있었습니다. 인터페이스 확장을하는 것이 훨씬 더 합리적입니다. IDisposable 마침내 블록에서 실행 시간 점검이 필요하지 않도록 이제 컴파일러는 반복자가 IEnumerator<T> 무조건적인 호출을 방출 할 수 있습니다 Dispose.

편집 : 엄청나게 유용합니다 Dispose 반복이 끝날 때 호출됩니다 (그러나 끝). 이는 반복자가 리소스를 유지할 수 있음을 의미합니다. 즉, 파일을 한 줄씩 읽을 수 있습니다. 반복자 블록이 생성됩니다 Dispose 어떤 것도 확인하는 구현 finally 반복자의 "현재 실행 지점"과 관련된 블록은 배치 될 때 실행되므로 반복자 내에 일반 코드를 작성할 수 있으며 정리가 적절하게 발생해야합니다.


1 1.0 사양을 되돌아 보면 이미 지정되었습니다. 1.0 구현이 전화하지 않았다는이 이전 진술을 아직 확인할 수 없었습니다. Dispose.

다른 팁

ienumerableu003CT> idisposable을 상속하지 않습니다. ienumeratoru003CT> 그러나 비 게 릭 IENUMERATOR는 그렇지 않지만 idisposable을 상속합니다. 당신이 사용할 때도 각각 비 게 니체 ienumerable (ienumerator를 반환)의 경우, 열거자가 인터페이스를 구현하는 경우 컴파일러는 여전히 idisposable 및 call dispose ()에 대한 검사를 생성합니다.

일반 열거자를 생각합니다u003CT> 런타임 유형 확인이 필요하지 않도록 Idisposable에서 상속됩니다. 열거자가 빈 DERPOSE () 메소드를 가지고 있으면 최적화 될 수 있으므로 더 나은 성능을 가져야하는 DERPOSE ()를 호출 할 수 있습니다. .

나는 이것이 오래된 토론이라는 것을 알고 있지만, 라이브러리 사용자가 맞춤형 반복기를 구현할 수있는 T/ienumerator를 사용한 Ienumerable을 사용한 라이브러리를 재심 적으로 썼습니다.

나는 t의 ienumerator가 idisposable에서 물려받는 것이 매우 이상하다는 것을 알았습니다. 우리는 당신의 불가사의 한 자원을 자유롭게하려면 idisposable을 구현합니까? 따라서 IO 스트림 등과 같이 실제로 관리되지 않는 리소스를 보유하는 열거 자와 관련이있을 것입니다. 왜 사용자가 Enumerator의 Ienumerator와 ENUMERATOR에 IDISPOSABLE을 모두 구현할 수 없는가? 내 책에서 이것은 단일 책임 원칙을 위반합니다.

ienumerable 'iderit idisposing? .NET 리플렉터 또는 MSDN. 당신은 당신이 그것을 혼란스럽게하지 않는다고 확신합니까? ienumerator? 그것은 컬렉션을 열거하기 위해서만 장수를위한 것이 아니기 때문에 idisposing을 사용합니다.

Andersh 자신이나 그와 가까운 누군가로부터 응답을받을 수 없다면, 이것에 대해 결정적이기가 조금 어렵습니다.

그러나 내 추측은 C#에 동시에 도입 된 "수율"키워드와 관련이 있다고 생각합니다. "수율 return x"가 사용될 때 컴파일러가 생성 한 코드를 보면 Ienumerator를 구현하는 도우미 클래스에 랩핑 된 방법이 표시됩니다. Ienumerator가 idisposable에서 내려 가면 열거가 완료되면 청소할 수 있습니다.

IIRC의 모든 것을 가지고 있습니다 IEnumerable<T> 그리고 IEnumerable 결과입니다 IEnumerable .NET의 템플릿 물건을 포식합니다. 나는 당신의 질문이 같은 방식으로 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top