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 da linguagem C# e o para cada um... Próxima construção no Visual Basic oculta a complexidade de 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, usando foreach ou For Each...Next é recomendado.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

Inicialmente, o enumerador está posicionado antes do primeiro elemento a Span<T>.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 a Span<T> antes de ler o valor de Current.You must call MoveNext to advance the enumerator to the first item in the Span<T> before reading the value of Current.

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

Se MoveNext passa o final dos Span<T>, MoveNext retorna false.If MoveNext passes the end of the Span<T>, MoveNext returns false. Quando o enumerador está neste estado, chamadas subsequentes para MoveNext também retornam false e Current é indefinido.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. Não é possível definir Current para o primeiro item no Span<T> 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 para o Span<T>.The enumerator does not have exclusive access to the Span<T>. Além disso, os dados subjacentes na qual se baseia o alcance também podem ser modificados.In addition, the underlying data on which the span is based can also be modified. Portanto, enumerar ao longo de um período intrinsecamente não é um procedimento thread-safe.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. Para garantir acesso thread-safe 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 período será enumerado antes do ClearContents método é 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 da extensão: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 de antes do período, como a versão revisada de enumerar os EnumerateSpan método faz, no exemplo a seguir, o ClearContents método não modifica dados span de 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 no qual a extensão 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 no .NET, o Span<T>.Enumerator:Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

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

  • Não inclui um Reset método, que pode definir o enumerador como sua posição inicial antes do primeiro elemento no período.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 das implementações lançarem 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