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を返すこともfalseCurrentが定義されていません。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は、 ref 構造体します。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 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>.

適用対象