Span<T>.Enumerator 구조체

정의

Span<T>의 요소에 대한 열거자를 제공합니다.Provides an enumerator for the elements of a Span<T>.

public: value class Span<T>::Enumerator
public struct Span<T>.Enumerator
type Span<'T>.Enumerator = struct
Public Structure Span(Of T).Enumerator

형식 매개 변수

T
상속
Span<T>.Enumerator

설명

C# foreach 의 C# 언어 및 각각에 대 한 중... 다음 Visual Basic의 구문이 복잡 한 열거자를 숨깁니다.The C# foreach of the C# language and the For Each...Next construct in Visual Basic hides the complexity of enumerators. 직접 사용 하 여 열거자를 조작 하는 대신 foreach 또는 For Each...Next 것이 좋습니다.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

열거자의 첫 번째 요소 앞에 위치는 처음에 Span<T>합니다.Initially, the enumerator is positioned before the first element in the Span<T>. 이 위치에서 Current는 정의되지 않습니다.At this position, Current is undefined. 호출 해야 합니다 MoveNext 하 여 열거자의 첫 번째 항목으로 이동 합니다 Span<T> 의 값을 읽기 전에 Current입니다.You must call MoveNext to advance the enumerator to the first item in the Span<T> before reading the value of Current.

Current 반환 될 때까지 동일한 값 MoveNext 라고 합니다.Current returns the same value until MoveNext is called. MoveNext 설정 Current 에서 다음 항목으로는 Span<T>합니다.MoveNext sets Current to the next item in the Span<T>.

경우 MoveNext 의 끝을 통과 합니다 Span<T>MoveNext 반환 false합니다.If MoveNext passes the end of the Span<T>, MoveNext returns false. 이 상태에서 후속 호출에서 열거자의 경우 MoveNext 반환할 수도 falseCurrent 정의 되지 않습니다.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. 설정할 수 없습니다 Current 의 첫 번째 항목에는 Span<T> 다시 새 열거자 인스턴스를 대신 만들어야 합니다.You cannot set Current to the first item in the Span<T> again; you must create a new enumerator instance instead.

열거자에 대 한 단독 액세스 되지 않은 Span<T>합니다.The enumerator does not have exclusive access to the Span<T>. 또한 범위를 기준으로 하는 기본 데이터를 수정할 수도 있습니다.In addition, the underlying data on which the span is based can also be modified. 따라서 범위 열거 본질적으로 스레드로부터 안전한 프로시저가 아닙니다.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. 을 열거 하는 동안 스레드로부터 안전을 보장 하기 위해 고유한 동기화를 구현 해야 합니다.To guarantee thread safety during enumeration, you must implement your own synchronization. 예를 들어, 다음 코드에 경합 상태가 있습니다.For example, the following code has a race condition. 전에 범위를 열거 하는 보장 하지 않습니다는 ClearContents 메서드를 실행 합니다.It does not ensure that the span will be enumerated before the ClearContents method executes. 결과적으로, 내부 배열 범위의 열거 동안 지워집니다.As a result, the underlying array is cleared during enumeration of the span:

using System;
using System.Threading.Tasks;

class Program
{
    private static readonly byte[] _array = new byte[5];

    static void Main()
    {
        new Random(42).NextBytes(_array);
        Span<byte> span = _array;

        Task.Run( () => ClearContents() );

       EnumerateSpan(span);
    }

    public static void ClearContents()
    {
        Task.Delay(20).Wait();
        lock (_array)
        {
           Array.Clear(_array, 0, _array.Length);
        }
    }

    public static void EnumerateSpan(Span<byte> span)
    {
        foreach (byte element in span)
        {
            Console.WriteLine(element);
            Task.Delay(10).Wait();
        }
    }
}
// The example displays output like the following:
//     62
//     23
//     186
//     0
//     0

수정 된 버전의 범위를 열거 하기 전에 배열에 대 한 액세스를 동기화 하는 경우는 EnumerateSpan 메서드는 다음 예제에서는 ClearContents 메서드 열거 하는 동안 기본 범위 데이터를 수정 하지 않습니다.If you synchronize access to the array before enumerating the span, as the revised version of the EnumerateSpan method does in the following example, the ClearContents method doesn't modify underlying span data during enumeration. 이 예제에서는 잠금 범위를 기준으로 하는 내부 배열은 참고 합니다.Note that the example locks the underlying array on which the span is based.

public static void EnumerateSpan(Span<byte> span)
{
    lock (_array)
    {
        foreach (byte element in span)
        {
            Console.WriteLine(element);
            Task.Delay(10).Wait();
        }
    }
}
// The example displays the following output:
//    62
//    23
//    186
//    150
//    174

.NET에서는 몇 가지 다른 열거자 구조와는 달리는 Span<T>.Enumerator:Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

  • 구현 하지 않는 합니다 IEnumerator 또는 IEnumerator<T> 인터페이스입니다.Does not implement the IEnumerator or IEnumerator<T> interface. 왜냐하면 Span<T>.Enumerator 되는 ref 구조체합니다.This is because Span<T>.Enumerator is a ref struct.

  • 포함 되지 않습니다는 Reset 메서드를 범위에서 첫 번째 요소 앞의 초기 위치에 열거자를 설정할 수 있습니다.Does not include a Reset method, which can set the enumerator to its initial position before the first element in the span. (의 IEnumerator.Reset() 인터페이스의 일부로 메서드를 구현 해야 하지만 대부분의 구현자 또는 예외를 throw 하지 구현을 제공 합니다.)(The IEnumerator.Reset() method must be implemented as part of the interface, but most implementors either throw an exception or provide no implementation.)

속성

Current

열거자의 현재 위치에 있는 항목에 대한 참조를 가져옵니다.Gets a reference to the item at the current position of the enumerator.

메서드

MoveNext()

열거자를 Span<T>의 다음 항목으로 이동합니다.Advances the enumerator to the next item of the Span<T>.

적용 대상