IEnumerator와 IEnumerable의 차이점은 무엇입니까? [복제]
IEnumerator와 IEnumerable의 차이점은 무엇입니까?
IEnumerable 은 IEnumerator 인터페이스 를 반환하는 하나의 메서드 GetEnumerator 를 정의 하는 인터페이스이며, 이는 다시 컬렉션에 대한 읽기 전용 액세스를 허용합니다. IEnumerable을 구현하는 컬렉션은 foreach 문과 함께 사용할 수 있습니다.
정의
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
An IEnumerator
은 열거 할 수있는 것입니다. Current
속성과 MoveNext
및 Reset
메서드가 있습니다 (.NET 코드에서는 가능하지만 명시 적으로 호출하지 않을 것입니다).
An IEnumerable
은 열거 할 수있는 것입니다 ... 즉, .NET Framework를 반환하는 GetEnumerator 메서드가 있음을 의미합니다 IEnumerator
.
어떤 것을 사용합니까? 사용하는 유일한 이유 IEnumerator
는 열거하는 비표준 방법 (즉, 다양한 요소를 하나씩 반환하는 방법)이 있고 그 작동 방식을 정의해야하는 경우입니다. .NET을 구현하는 새 클래스를 만듭니다 IEnumerator
. 하지만 여전히 수업 IEnumerator
에서 반환해야합니다 IEnumerable
.
열거 자 (구현 IEnumerator<T>
)의 모양을 보려면 , 또는에 Enumerator<T>
포함 된 클래스와 같은 클래스를 참조하십시오 . 을 구현하는 클래스 를 보려면 표준 컬렉션 클래스를 참조하십시오.List<T>
Queue<T>,
Stack<T>
IEnumerable
Enumerator
쇼 당신에게 목록 또는 컬렉션의 항목. Enumerator의 각 인스턴스는 특정 위치 (첫 번째 요소, 7 번째 요소 등)에 있으며 해당 요소를 제공 IEnumerator.Current
하거나 ( ) 다음 요소 로 이동할 수 있습니다 ( IEnumerator.MoveNext
). foreach
C #에서 루프 를 작성할 때 컴파일러는 열거자를 사용하는 코드를 생성합니다.
An Enumerable
은 Enumerator
s를 제공 할 수있는 클래스입니다 . 항목을 보는를 GetEnumerator
제공 하는 메서드 Enumerator
가 있습니다. foreach
C #에서 루프 를 작성할 때 루프에서 사용하는 호출 GetEnumerator
을 생성하는 코드입니다 Enumerator
.
IEnumerable
그리고 IEnumerator
두 인터페이스이다. IEnumerable
라는 메서드가 하나뿐입니다 GetEnumerator
. 이 메서드는 (모든 메서드가 void를 포함하여 무언가를 반환하므로) 인터페이스이고 그 인터페이스는 IEnumerator
. 컬렉션 클래스에서 열거 자 논리를 구현할 때 구현합니다 IEnumerable
(일반 또는 비 일반). IEnumerable
한 가지 방법 만 IEnumerator
있고 두 가지 방법 ( MoveNext
and Reset
)과 하나의 속성이 Current
있습니다. 이해하기 쉽 IEnumerable
도록 IEnumerator
내부 를 포함하는 상자로 간주 하십시오 (상속 또는 포함을 통하지 않음). 더 나은 이해를 위해 코드를 참조하십시오.
class Test : IEnumerable, IEnumerator
{
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public object Current
{
get { throw new NotImplementedException(); }
}
public bool MoveNext()
{
throw new NotImplementedException();
}
public void Reset()
{
throw new NotImplementedException();
}
}
'Programing' 카테고리의 다른 글
sqlite 쿼리에서 dict를 어떻게 얻을 수 있습니까? (0) | 2020.08.26 |
---|---|
Android에서 GSON 또는 다른 라이브러리를 사용하지 않고 개조를 사용하여 문자열로 응답을 얻는 방법 (0) | 2020.08.26 |
Windows의 Cygwin에서 crontab을 어떻게 실행합니까? (0) | 2020.08.26 |
C # 제네릭 오류에 대한 도움말- " 'T'형식은 nullable이 아닌 값 형식이어야합니다." (0) | 2020.08.26 |
메시지 펌프 란? (0) | 2020.08.26 |