Span<T>.Enumerator Span<T>.Enumerator Span<T>.Enumerator Span<T>.Enumerator Struct

Definition

Stellt einen Enumerator für diese Elemente eines Span<T>-Elements bereit.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

Typparameter

T
Vererbung
Span<T>.EnumeratorSpan<T>.EnumeratorSpan<T>.EnumeratorSpan<T>.Enumerator

Hinweise

Die C#- Foreach der C#-Sprache und die für jede... Nächste Konstrukt in Visual Basic Blendet die Komplexität der Enumeratoren.The C# foreach of the C# language and the For Each...Next construct in Visual Basic hides the complexity of enumerators. Anstatt ein direktes Bearbeiten des Enumerators, mit foreach oder For Each...Next wird empfohlen.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

Zunächst wird der Enumerator vor das erste Element in der Span<T>.Initially, the enumerator is positioned before the first element in the Span<T>. An dieser Position ist Current nicht definiert.At this position, Current is undefined. Rufen Sie MoveNext auf den Enumerator auf das erste Element in der Span<T> vor dem Lesen des Werts von Current.You must call MoveNext to advance the enumerator to the first item in the Span<T> before reading the value of Current.

Current Gibt den gleichen Wert bis MoveNext aufgerufen wird.Current returns the same value until MoveNext is called. MoveNext Legt Current zum nächsten Element in der Span<T>.MoveNext sets Current to the next item in the Span<T>.

Wenn MoveNext übergibt am Ende der Span<T>, MoveNext gibt false.If MoveNext passes the end of the Span<T>, MoveNext returns false. Wenn der Enumerator ist auf diesem Status, schlagen nachfolgende Aufrufe MoveNext auch zurückgeben false und Current ist nicht definiert.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. Sie können nicht festgelegt werden Current auf das erste Element in der Span<T> erneut; Sie müssen eine neue Enumeratorinstanz stattdessen erstellen.You cannot set Current to the first item in the Span<T> again; you must create a new enumerator instance instead.

Der Enumerator hat keinen exklusiven Zugriff auf die Span<T>.The enumerator does not have exclusive access to the Span<T>. Darüber hinaus können die zugrunde liegenden Daten, die auf denen die Spanne basiert auch geändert werden.In addition, the underlying data on which the span is based can also be modified. Aus diesem Grund ist die Enumeration einer Spans systemintern keine threadsichere Prozedur.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. Um während der Enumeration Threadsicherheit zu gewährleisten, müssen Sie eine eigene Synchronisierung implementieren.To guarantee thread safety during enumeration, you must implement your own synchronization. Der folgende Code wird z. B. eine Racebedingung hat.For example, the following code has a race condition. Es stellt nicht sicher, dass die Spanne vor aufgelistet werden, wird die ClearContents Methode ausgeführt wird.It does not ensure that the span will be enumerated before the ClearContents method executes. Daher wird das zugrunde liegende Array während der Enumeration der Spanne gelöscht: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

Wenn Sie Zugriff auf das Array vor der Enumeration der Spans, die überarbeitete Version der synchronisieren die EnumerateSpan Methode im folgenden Beispiel wird die ClearContents Methode nicht ändern, die zugrunde liegende Spanne Daten während der Enumeration.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. Beachten Sie, dass im Beispiel wird das zugrunde liegende Array Sperren auf dem die Spanne basiert.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

Im Gegensatz zu einigen anderen Enumerator-Strukturen in .NET die Span<T>.Enumerator:Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

  • Implementiert nicht die IEnumerator oder IEnumerator<T> Schnittstelle.Does not implement the IEnumerator or IEnumerator<T> interface. Grund hierfür ist, Span<T>.Enumerator ist eine Referenzstruktur.This is because Span<T>.Enumerator is a ref struct.

  • Enthält keine Reset -Methode, die den Enumerator auf seine anfängliche Position vor dem ersten Element in der Spanne festlegen kann.Does not include a Reset method, which can set the enumerator to its initial position before the first element in the span. (Die IEnumerator.Reset() Methode muss als Teil der Schnittstelle implementiert werden, aber die meisten Implementierungen eine Ausnahme auslösen, oder es keine Implementierung bereitstellen.)(The IEnumerator.Reset() method must be implemented as part of the interface, but most implementors either throw an exception or provide no implementation.)

Eigenschaften

Current Current Current Current

Ruft einen Verweis auf das Element an der aktuellen Position des Enumerators ab.Gets a reference to the item at the current position of the enumerator.

Methoden

MoveNext() MoveNext() MoveNext() MoveNext()

Legt den Enumerator auf das nächste Element von Span<T> fest.Advances the enumerator to the next item of the Span<T>.

Gilt für: