Span<T>.Enumerator Yapı

Tanım

Öğesi için bir Numaralandırıcı sağlar 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ür Parametreleri

T
Devralma
Span<T>.Enumerator

Açıklamalar

C# dilinin ve Için C# foreach ... Visual Basic sonraki yapı, numaralandırıcıların karmaşıklığını gizler.The C# foreach of the C# language and the For Each...Next construct in Visual Basic hides the complexity of enumerators. Numaralandırıcıyı doğrudan işlemek yerine foreach veya kullanılması For Each...Next önerilir.Instead of directly manipulating the enumerator, using foreach or For Each...Next is recommended.

Başlangıçta, Numaralandırıcı içindeki ilk öğeden önce konumlandırılır Span<T> .Initially, the enumerator is positioned before the first element in the Span<T>. Bu konumda Current tanımsız.At this position, Current is undefined. MoveNextDeğerini okumadan önce içindeki ilk öğeye numaralandırıcıyı ilerletmek için öğesini çağırmanız gerekir 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 çağrılana kadar aynı değeri döndürür MoveNext .Current returns the same value until MoveNext is called. MoveNextCurrentiçindeki bir sonraki öğeye ayarlar Span<T> .MoveNext sets Current to the next item in the Span<T>.

MoveNextÖğesinin sonunu geçerse Span<T> , MoveNext döndürür false .If MoveNext passes the end of the Span<T>, MoveNext returns false. Numaralandırıcı bu durumda olduğunda, sonraki çağrılar MoveNext da döndürülür false ve Current tanımsız olur.When the enumerator is at this state, subsequent calls to MoveNext also return false and Current is undefined. CurrentYeniden ilk öğe olarak ayarlayamazsınız Span<T> ; bunun yerine yeni bir Numaralandırıcı örneği oluşturmanız gerekir.You cannot set Current to the first item in the Span<T> again; you must create a new enumerator instance instead.

Numaralandırıcının öğesine özel erişimi yok Span<T> .The enumerator does not have exclusive access to the Span<T>. Ayrıca, yayılma alanındaki temel alınan veriler de değiştirilebilir.In addition, the underlying data on which the span is based can also be modified. Bu nedenle, bir yayılma aracılığıyla sıralama, iş parçacığı güvenli bir yordam değildir doğası gereği.Therefore, enumerating through a span is intrinsically not a thread-safe procedure. Numaralandırma sırasında iş parçacığı güvenliğini güvence altına almak için kendi eşitlemesini uygulamanız gerekir.To guarantee thread safety during enumeration, you must implement your own synchronization. Örneğin, aşağıdaki kodun bir yarış durumu vardır.For example, the following code has a race condition. Metodun, yöntemin yürütmeden önce numaralandırılacağını garanti etmez ClearContents .It does not ensure that the span will be enumerated before the ClearContents method executes. Sonuç olarak, yayılma alanının numaralandırılması sırasında temeldeki dizi temizlenir: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

Aralığı numaralandırmadan önce diziye erişimi eşitlerseniz, yöntemin düzeltilen sürümü aşağıdaki örnekte olduğu gibi, EnumerateSpan ClearContents yöntemi numaralandırma sırasında temel alınan yayılmış verileri değiştirmez.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. Örneğin, yayılma alanındaki temel alınan diziyi kilitlediği unutulmamalıdır.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 'teki bazı diğer Numaralandırıcı yapıların aksine Span<T>.Enumerator :Unlike some other enumerator structures in .NET, the Span<T>.Enumerator:

  • IEnumeratorVeya IEnumerator<T> arabirimini uygulamaz.Does not implement the IEnumerator or IEnumerator<T> interface. Bunun nedeni Span<T>.Enumerator bir başvuru yapısı.This is because Span<T>.Enumerator is a ref struct.

  • Reset, Numaralandırıcıyı, yayılma alanındaki ilk öğeden önce ilk konumuna ayarlayabilen bir yöntemi içermez.Does not include a Reset method, which can set the enumerator to its initial position before the first element in the span. ( IEnumerator.Reset() Yöntemi arabirimin bir parçası olarak uygulanmalıdır, ancak çoğu uygulama bir özel durum oluşturur veya uygulama sağlamaz.)(The IEnumerator.Reset() method must be implemented as part of the interface, but most implementors either throw an exception or provide no implementation.)

Özellikler

Current

Numaralandırıcının geçerli konumundaki öğeye bir başvuru alır.Gets a reference to the item at the current position of the enumerator.

Yöntemler

MoveNext()

Numaralandırıcıyı öğesinin bir sonraki öğesine ilerletir Span<T> .Advances the enumerator to the next item of the Span<T>.

Şunlara uygulanır