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
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
.
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
. 나는 당신의 질문이 같은 방식이라고 생각합니다.
'ProgramingTip' 카테고리의 다른 글
포함 할 PHP 전달 변수 (0) | 2020.10.30 |
---|---|
명령 줄에서 CMake 옵션 ()을 설정하는 방법 (0) | 2020.10.30 |
MVC 패턴에 맞게 게임 코드를 구성해야합니까? (0) | 2020.10.30 |
“put”이 기존 값을 카트리지 쓰나요? (0) | 2020.10.30 |
2D 배열을 3 차원으로 N 번 복사 (Python) (0) | 2020.10.29 |