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

Definice

Poskytuje enumerátor pro prvky 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
Dědičnost
Span<T>.EnumeratorSpan<T>.EnumeratorSpan<T>.EnumeratorSpan<T>.Enumerator

Poznámky

C# ForEach C# jazyka a pro každý... Další konstrukce v Visual Basic skrývá složitost čítačů.The C# foreach of the C# language and the For Each...Next construct in Visual Basic hides the complexity of enumerators. Místo toho, aby se mohl použít foreach nebo For Each...Next , se doporučuje přímo manipulovat s enumerátorem.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

Zpočátku je enumerátor umístěn před první prvek v Span<T>.Initially, the enumerator is positioned before the first element in the Span<T>. Na této pozici Current není definován.At this position, Current is undefined. Je nutné zavolat MoveNext pro pokračovánívýčtuSpan<T> na první položku v rozhraní před čtením hodnoty Current.You must call MoveNext to advance the enumerator to the first item in the Span<T> before reading the value of Current.

Currentvrací stejnou hodnotu, dokud MoveNext není volána.Current returns the same value until MoveNext is called. MoveNextnastaví Current na další položku Span<T>v.MoveNext sets Current to the next item in the Span<T>.

Pokud MoveNext předá konec Span<T>, MoveNext vrátí. falseIf MoveNext passes the end of the Span<T>, MoveNext returns false. Když je enumerátor v tomto stavu, následné volání MoveNext vrátí false také a Current není definováno.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. Na první položku Current Span<T> se znovu nedá nastavit. musíte místo toho vytvořit novou instanci enumerátoru.You cannot set Current to the first item in the Span<T> again; you must create a new enumerator instance instead.

Enumerátor nemá výhradní přístup k Span<T>.The enumerator does not have exclusive access to the Span<T>. Kromě toho je možné upravit také podkladová data, na kterých je rozsah založen.In addition, the underlying data on which the span is based can also be modified. Proto vytváření výčtu prostřednictvím rozpětí je vnitřně nebezpečné pro přístup z více vláken.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. Chcete-li zaručit bezpečnost vlákna během výčtu, je nutné implementovat vlastní synchronizaci.To guarantee thread safety during enumeration, you must implement your own synchronization. Například následující kód má podmínku časování.For example, the following code has a race condition. Nezajišťuje, aby se rozsah vyčísloval před spuštěním ClearContents metody.It does not ensure that the span will be enumerated before the ClearContents method executes. V důsledku toho je příslušné pole vymazáno během výčtu rozpětí: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

Pokud synchronizujete přístup k poli před vytvořením výčtu rozsahu, jako revidovaná verze EnumerateSpan metody v následujícím příkladu ClearContents , metoda během výčtu nezmění podkladová data rozpětí.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. Všimněte si, že příklad zamkne základní pole, na kterém je rozsah založený.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

Na Span<T>.Enumeratorrozdíl od některých dalších struktur enumerátorů v rozhraní .NET:Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

  • Neimplementuje IEnumerator rozhraní nebo IEnumerator<T> .Does not implement the IEnumerator or IEnumerator<T> interface. Důvodem je, Span<T>.Enumerator že je Struktura ref.This is because Span<T>.Enumerator is a ref struct.

  • Reset Neobsahuje metodu, která může nastavit enumerátor na počáteční pozici před prvním prvkem v rozsahu.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 musí být implementována jako součást rozhraní, ale většina implementací buď vyvolala výjimku, nebo neposkytuje žádnou implementaci.)(The IEnumerator.Reset() method must be implemented as part of the interface, but most implementors either throw an exception or provide no implementation.)

Vlastnosti

Current Current Current Current

Získá odkaz na položku na aktuální pozici čítače výčtu.Gets a reference to the item at the current position of the enumerator.

Metody

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

Posune enumerátor na další položku Span<T>.Advances the enumerator to the next item of the Span<T>.

Platí pro