Span<T>.Enumerator Struktura

Definicja

Dostarcza moduł wyliczający dla elementów 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

Parametry typu

T
Dziedziczenie
Span<T>.Enumerator

Uwagi

C# Instrukcja foreach C# języka i dla każdego... Następna konstrukcja w Visual Basic ukrywa złożoność modułów wyliczających.The C# foreach of the C# language and the For Each...Next construct in Visual Basic hides the complexity of enumerators. Zamiast bezpośrednio manipulowania modułem wyliczania, foreach należy For Each...Next użyć lub jest zalecane.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

Początkowo moduł wyliczający jest umieszczony przed pierwszym elementem w Span<T>.Initially, the enumerator is positioned before the first element in the Span<T>. W tym miejscu Current nie jest zdefiniowane.At this position, Current is undefined. Przed odczytaniem wartości parametru należy wywołać metodę MoveNext przechodzenia do poziomu modułu wyliczającego do pierwszego elementu welemencie.Current Span<T>You must call MoveNext to advance the enumerator to the first item in the Span<T> before reading the value of Current.

Currentzwraca tę samą wartość, MoveNext dopóki nie zostanie wywołana.Current returns the same value until MoveNext is called. MoveNextustawia Current następną pozycję Span<T>w.MoveNext sets Current to the next item in the Span<T>.

Jeśli MoveNext kończy koniec Span<T>, MoveNext zwraca. falseIf MoveNext passes the end of the Span<T>, MoveNext returns false. Gdy moduł wyliczający jest w tym stanie, kolejne wywołania MoveNext również zwracają false i Current są niezdefiniowane.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. Nie można ustawić Current jako pierwszego elementu w tym Span<T> przypadku, należy zamiast tego utworzyć nowe wystąpienie modułu wyliczającego.You cannot set Current to the first item in the Span<T> again; you must create a new enumerator instance instead.

Moduł wyliczający nie ma wyłącznego dostępu do Span<T>.The enumerator does not have exclusive access to the Span<T>. Dodatkowo można również modyfikować dane bazowe, na których oparto zakres.In addition, the underlying data on which the span is based can also be modified. W związku z tym wyliczanie przez zakres nie jest w sposób wewnętrzny bezpieczny dla wątków.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. Aby zagwarantować bezpieczeństwo wątków podczas wyliczania, należy zaimplementować własną synchronizację.To guarantee thread safety during enumeration, you must implement your own synchronization. Na przykład poniższy kod ma sytuację wyścigu.For example, the following code has a race condition. Nie gwarantuje to, że zakres zostanie wyliczony przed wykonaniem ClearContents metody.It does not ensure that the span will be enumerated before the ClearContents method executes. W efekcie tablica bazowa jest czyszczona podczas wyliczania zakresu: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

Jeśli synchronizujesz dostęp do tablicy przed wyliczeniem zakresu, ponieważ poprawiona wersja EnumerateSpan metody w poniższym przykładzie ClearContents Metoda nie modyfikuje danych bazowego zakresu podczas wyliczania.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. Należy zauważyć, że przykład blokuje tablicę bazową, na której bazuje zakres.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

W przeciwieństwie do innych struktur modułu wyliczającego Span<T>.Enumeratorw programie .NET:Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

  • Nie implementuje IEnumerator interfejsu lub IEnumerator<T> .Does not implement the IEnumerator or IEnumerator<T> interface. Jest to spowodowane Span<T>.Enumerator tym, że jest strukturą ref.This is because Span<T>.Enumerator is a ref struct.

  • Nie zawiera Reset metody, która może ustawić moduł wyliczający na jego początkową pozycję przed pierwszym elementem w zakresie.Does not include a Reset method, which can set the enumerator to its initial position before the first element in the span. IEnumerator.Reset() (Metoda musi być zaimplementowana jako część interfejsu, ale większość realizatorów zgłasza wyjątek lub nie zapewnia implementacji).(The IEnumerator.Reset() method must be implemented as part of the interface, but most implementors either throw an exception or provide no implementation.)

Właściwości

Current

Pobiera odwołanie do elementu w bieżącej pozycji modułu wyliczającego.Gets a reference to the item at the current position of the enumerator.

Metody

MoveNext()

Przesuwa moduł wyliczający do następnego elementu Span<T>.Advances the enumerator to the next item of the Span<T>.

Dotyczy