C#: 사용자 정의 ienumerator를 구현할 곳
-
19-09-2019 - |
문제
구현하는 수업이 있다고 말합니다 IEnumerable<T>
. 현재 사용합니다 yield
키워드 GetEnumerator()
방법. 그러나 지금은 조금 더해야합니다. 예를 들어, 나는 나 자신을 따라 청소하고 싶습니다. 이렇게하려면, 내가 간과하지 않는 한, 나는 IEnumerator<T>
상호 작용. 하지만 어디서 그렇게해야한다고 말하겠습니까?
클래스 자체가 그것을 구현해야합니다 GetEnumerator()
반품 this
? 아니면 개인 수업에서 숨기는 것이 더 낫습니까? 아니면 완전히 다른 클래스일까요? 이것에 대한 일반적인 관행은 무엇입니까?
해결책
열거자가 폐기 될 때 몇 가지 자원을 청소하는 것만으로도 foreach
루프, 당신은 당신이 가진 것과 함께 그것을 할 수 있습니다. 반복자 메소드에 시도/마침내 블록을 추가하십시오.
이와 같이:
public IEnumerator<T> GetEnumerator()
{
try
{
// your iterator code here
}
finally
{
// cleanup code here
}
}
그게 전부입니다.
다른 팁
나는 ienumerator를 위해 수업과 함께 갈 것입니다u003CT> . 이것은 컬렉션의 일부가 아니라 열거 과정의 일부인 상태 (현재 위치)를 저장해야합니다.
이것을 위해 수업을 전혀 쓸 필요가 없을 수도 있습니다. 반복 메소드가 돌아올 수 있습니다 IEnumerable<T>
, 수업이 구현되면만으로도 IEnumerable<T>
그리고 다른 것은 아무것도 아닙니다. 단지 모든 것을위한 반복자 방법을 작성하십시오.
그렇지 않은 경우, 당신은 구현하는 외부 클래스를 고수해야합니다. IEnumerable<T>
반복자 방법이 있어야합니다 GetEnumerator
, 그런 다음 반복 후 청소하기 어려운 일을 할 필요가 없습니다.
IEnumerator<T>
~에서 얻다 IDisposable
. 반복 메소드가 구현됩니다 Dispose
실행함으로써 finally
마지막 후에 블록 또는 코드 yield return
.