문제

구현하는 수업이 있다고 말합니다 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.

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