ProgramingTip

IEnumerator는 왜

bestdevel 2020. 10. 30. 08:17
반응형

IEnumerator는 왜 비 제네릭 IEnumerator는 상속되어있는 동안 IDisposable?


제네릭 IEnumerator<T>은 IDisposable에서 상속 비 제네릭 인터페이스 IEnumerator는 상속하지 않습니다. 왜 이렇게 설계 되었습니까?

일반적으로 foreach 문을 사용하여 IEnumerator<T>인스턴스 를 진행 합니다. foreach의 생성 된 코드에는 마침내 Dispose ()를 호출하는 try-finally 블록이 있습니다.


기본적으로 그것은 감독입니다. C # 1.0에서는 1을 호출하지 foreach 않습니다 . C # 1.2으로 - (VS2003에 도입 변태, 더 1.1 없다) 체크하기 시작 반복자 구현 여부 블록 - 후 향적으로 만들기 때문에, 그것은 그런 식으로해야 우리 할 일을했을 연장이 의 모든 사람의 구현을 깨진을 구석으로입니다 . 그들이 보기 처음에 반복자를 처분 하는 것이 유용하다는 것을 알아 냈다-plane , 확실히 나는 확장했을을 구석으로 입니다.Dispose foreachfinallyIDisposableIEnumeratorIDisposableIEnumeratorforeachIEnumeratorIDisposable

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

편집 : Dispose반복이 끝날 때 호출되는 것이 매우 유용 합니다. 이는 반복기가 리소스를 보유 할 수 있음을 의미합니다. 즉, 파일을 한 줄씩 읽을 수 있습니다. 블록은 반복기 반복기 의 "현재 실행 지점"관련된과 Dispose모든 finally블록이 폐기 될 때 실행 되도록 하는 구현을 생성 합니다. 반복기 내에서 수행 코드를 사용하고 정리가 수행되어야합니다.


1 1.0 사양을 확인하면 이미 지정되어 있습니다. 나는 아직 1.0 구현이 호출되지 않았다 Dispose.


IEnumerable <T>는 IDisposable을 상속하지 않습니다. IEnumerator <T>는 IDisposable을 상속하지만 제네릭이 아닌 IEnumerator는 상속하지 않습니다. 비 제네릭 IEnumerable (IEnumerable (IEnumerator를 반환))에 foreach사용하더라도 컴파일러는 여전히 IDisposable에 대한 검사를 생성하고 열거자가 인터페이스를 구현하는 경우 Dispose ()를 호출합니다.

제네릭 Enumerator <T>는 런타임에 사용하는 런타임 유형 검사가 필요합니다. 계속해서 Dispose ()를 호출하면 성능이 향상 될 수 있습니다. 열거 자에 빈 Dispose () 메서드가 있습니다.


I의 IEnumerable of T / IEnumerator of T를 사용하여 라이브러리 사용자가 T의 IEnumerator를 구현해야하는 사용자 지정 반복기를 구현할 수있는 라이브러리를 합리적으로 작성했습니다.

T가 IDisposable의 IE 분자는 매우 이상하다는 것을 알았습니다. 관리되지 않는 리소스를 배포 해제 할 수 있습니까? IO 스트림은 같이 있고 관리되지 않는 리소스를 보유하는 열거 자에만 있습니다. 사용자가 T의 IEnumerator와 IDisposable을 모두 해당 열거 자에 구현하도록 허용하지 않는 이유는 무엇입니까? 내 책에서 이것은 단일 책임 원칙-왜 열거 자 논리를 혼합하고 폐기 하는가를 위반합니다.


IEnumerable`은 IDisposing을 소유하고 있습니까? .NET 리플렉터 또는 MSDN . IEnumerator 와 혼동하지 꼭 보입니까? 그것은 컬렉션을 열거하기 위해서만 사용하고 수명을 의미하지 않기 때문에 IDisposing을 사용합니다.


AndersH 자신이나 그와 가까운 누군가로부터 응답을 얻지 않고 이에 대해 결정하기가 어렵습니다.

그러나 제 생각에는 C #에서 도입 된 "수익"이 있습니다. "yield return x"가 클래스 래핑 때 컴파일러에 의해 생성 된 코드를 보면 IEnumerator를 구현하는 도우미에 있습니다. IEnumerator가 IDisposable에서 내려 오면 열거가 완료 될 때 정리할 수 있습니다.


닷넷의 템플릿 물건을 낳는 것은 IIRC 필요에 대한 모든 것은 IEnumerable<T>IEnumerable의 결과이다 IEnumerable. 나는 당신의 질문이 같은 방식이라고 생각합니다.

참고 URL : https://stackoverflow.com/questions/232558/why-does-ienumeratort-inherit-from-idisposable-while-the-non-generic-ienumerat

반응형