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 # foreachFor Each ... 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. MoveNextCurrent에서 다음 항목으로 설정 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 도을 반환 false 하 고 Current 는 정의 되지 않습니다.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>.Enumeratorref 구조체이기 때문입니다.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>.

적용 대상