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

Definição

Fornece um enumerador para os elementos de um 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

Parâmetros de tipo

T
Herança
Span<T>.EnumeratorSpan<T>.EnumeratorSpan<T>.EnumeratorSpan<T>.Enumerator

Comentários

O C# foreach do C# idioma e o para cada... A próxima construção no Visual Basic oculta a complexidade dos enumeradores.The C# foreach of the C# language and the For Each...Next construct in Visual Basic hides the complexity of enumerators. Em vez de manipular diretamente o enumerador, foreach usar For Each...Next ou é recomendado.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

Inicialmente, o enumerador é posicionado antes do primeiro elemento Span<T>no.Initially, the enumerator is positioned before the first element in the Span<T>. Nesta posição, Current está indefinido.At this position, Current is undefined. Você deve chamar MoveNext para avançar o enumerador para o primeiro item Span<T> no antes de ler o valor Currentde.You must call MoveNext to advance the enumerator to the first item in the Span<T> before reading the value of Current.

CurrentRetorna o mesmo valor até MoveNext que seja chamado.Current returns the same value until MoveNext is called. MoveNextdefine Current para o próximo item Span<T>no.MoveNext sets Current to the next item in the Span<T>.

Se MoveNext passar o final Span<T>de, MoveNext retorna false.If MoveNext passes the end of the Span<T>, MoveNext returns false. Quando o enumerador está nesse estado, as chamadas MoveNext subsequentes também retornam false e Current são indefinidas.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. Você não pode Current definir para o primeiro item Span<T> no novamente; você deve criar uma nova instância de enumerador em vez disso.You cannot set Current to the first item in the Span<T> again; you must create a new enumerator instance instead.

O enumerador não tem acesso exclusivo ao Span<T>.The enumerator does not have exclusive access to the Span<T>. Além disso, os dados subjacentes nos quais o span é baseado também podem ser modificados.In addition, the underlying data on which the span is based can also be modified. Portanto, a enumeração por meio de um Span é intrinsecamente não um procedimento de thread-safe.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. Para garantir a segurança do thread durante a enumeração, você deve implementar sua própria sincronização.To guarantee thread safety during enumeration, you must implement your own synchronization. Por exemplo, o código a seguir tem uma condição de corrida.For example, the following code has a race condition. Ele não garante que o span será enumerado antes que o ClearContents método seja executado.It does not ensure that the span will be enumerated before the ClearContents method executes. Como resultado, a matriz subjacente é apagada durante a enumeração do span: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

Se você sincronizar o acesso à matriz antes de enumerar o span, como a versão revisada do EnumerateSpan método faz no exemplo a seguir, o ClearContents método não modifica os dados de span subjacentes durante a enumeração.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. Observe que o exemplo bloqueia a matriz subjacente na qual o span se baseia.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

Ao contrário de algumas outras estruturas de enumerador Span<T>.Enumeratorno .net, o:Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

  • Não implementa a IEnumerator interface ou IEnumerator<T> .Does not implement the IEnumerator or IEnumerator<T> interface. Isso ocorre porque Span<T>.Enumerator o é um struct de referência.This is because Span<T>.Enumerator is a ref struct.

  • Não inclui um Reset método, que pode definir o enumerador para sua posição inicial antes do primeiro elemento no span.Does not include a Reset method, which can set the enumerator to its initial position before the first element in the span. (O IEnumerator.Reset() método deve ser implementado como parte da interface, mas a maioria dos implementadores geram uma exceção ou não fornecem nenhuma implementação.)(The IEnumerator.Reset() method must be implemented as part of the interface, but most implementors either throw an exception or provide no implementation.)

Propriedades

Current Current Current Current

Obtém uma referência ao item na posição atual do enumerador.Gets a reference to the item at the current position of the enumerator.

Métodos

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

Avança o enumerador para o próximo item do Span<T>.Advances the enumerator to the next item of the Span<T>.

Aplica-se a