Span<T>.Enumerator Struktur

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>.Enumerator

Hinweise

Die C# foreach - C# Sprache und die for each-Sprache... Das nächste Konstrukt in Visual Basic verbirgt die Komplexität von Enumeratoren.The C# foreach of the C# language and the For Each...Next construct in Visual Basic hides the complexity of enumerators. Anstatt den Enumerator direkt zu manipulieren, wird foreach die For Each...Next Verwendung von oder empfohlen.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

Anfänglich wird der Enumerator vor dem ersten Element in der Span<T>positioniert.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. Sie müssen aufzurufen MoveNext , um den Enumerator vor dem Lesen des Werts Span<T> von Currentauf das erste Element in der zu setzen.You must call MoveNext to advance the enumerator to the first item in the Span<T> before reading the value of Current.

CurrentGibt den gleichen Wert zurück MoveNext , bis aufgerufen wird.Current returns the same value until MoveNext is called. MoveNextlegt Current auf das nächste Element in der Span<T>fest.MoveNext sets Current to the next item in the Span<T>.

Wenn MoveNext das Ende Span<T>von übergibt, wird MoveNext zurück falsegegeben.If MoveNext passes the end of the Span<T>, MoveNext returns false. Wenn sich der Enumerator in diesem Zustand befindet, geben nachfolg MoveNext Ende Aufrufe false von Current ebenfalls zurück und sind nicht definiert.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. Sie können nicht Current Span<T> erneut auf das erste Element im festlegen. stattdessen müssen Sie eine neue Enumeratorinstanz 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 den Span<T>.The enumerator does not have exclusive access to the Span<T>. Außerdem können die zugrunde liegenden Daten, auf denen die Spanne basiert, geändert werden.In addition, the underlying data on which the span is based can also be modified. Daher ist die Enumeration durch eine Spanne intrinsisch keine Thread sichere Prozedur.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. Um die Thread Sicherheit während der Enumeration 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 weist z. b. eine Racebedingung auf.For example, the following code has a race condition. Dadurch wird nicht sichergestellt, dass die Spanne vor der Ausführung der ClearContents -Methode aufgeführt wird.It does not ensure that the span will be enumerated before the ClearContents method executes. Folglich 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 den Zugriff auf das Array vor dem Auflisten der Spanne synchronisieren, wie die überarbeitete Version der EnumerateSpan Methode im folgenden Beispiel funktioniert, ändert die ClearContents -Methode keine zugrunde liegenden spannen 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 das zugrunde liegende Array gesperrt wird, 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

Anders als bei einigen anderen enumeratorstrukturen in .net Span<T>.Enumerator:Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

  • Implementiert nicht die- IEnumerator Schnitt IEnumerator<T> Stelle oder die-Schnittstelle.Does not implement the IEnumerator or IEnumerator<T> interface. Der Grund hierfür Span<T>.Enumerator ist, dass eine ref-Strukturist.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 lösen entweder eine Ausnahme aus oder stellen keine Implementierung bereit.)(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

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()

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: