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

Определение

Предоставляет перечислитель для элементов 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>.EnumeratorSpan<T>.EnumeratorSpan<T>.EnumeratorSpan<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 возвращает false.If 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 метод не изменяет базовые span данные во время перечисления.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 метод, который можно задать перечислитель в исходное положение перед первым элементом в элементе управления span.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 Current Current Current

Возвращает ссылку на элемент в текущей позиции перечислителя.Gets a reference to the item at the current position of the enumerator.

Методы

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

Перемещает перечислитель к следующему элементу Span<T>.Advances the enumerator to the next item of the Span<T>.

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