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# ForEach C# языка и для каждого... Следующая конструкция в 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. MoveNextЗадает Current следующий элемент Span<T>в.MoveNext sets Current to the next item in the Span<T>.

Если MoveNext передает конец Span<T>, MoveNext возвращает. falseIf 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>.Enumerator тем, что является структурой ссылок.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() (Метод должен быть реализован как часть интерфейса, но большинство методов реализации либо вызывают исключение, либо не предоставляют реализацию.)(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>.

Применяется к