📜  跨度<T>C#中的.Enumerator Struct

📅  最后修改于: 2021-05-29 19:40:58             🧑  作者: Mango

Span 是C#7.2引入的一项新功能,并在.NET Core 2.1中受支持。它提供对内存连续区域的类型安全访问。该内存可以位于堆,堆栈上或形成未分配的内存。 Span 被定义为ref struct ,这意味着它仅限于仅在堆栈上分配。引用结构设计的主要原因是要确保在使用Span 时不会引起其他堆分配。 Span 提高了执行速度并减少了现有代码中的内存分配。

在这里,Span 引用一些已经分配的连续内存(彩色块)。

跨度 .Enumerator结构提供了一种用于大跨度的元素的枚举器。其中Span 提供任意内存的连续区域的类型和内存安全表示。

句法:

public struct Span.Enumerator

范围:
这里的参数是T ,其中T是Span 中项目的类型。

例子:

// C# program to demonstrate Span.Enumerator Struct
using System;
using System.Threading.Tasks;
  
class GFG {
  
    // a array "arr" type of byte
    private static byte[] arr = new byte[4];
     
    // main method
    static void Main()
    {
        // ramdomly fillup the array "arr"
        new Random(30).NextBytes(arr);
          
        // implicitly cast the array
        // "arr" to span
        Span sp = arr;
  
        // Task.Run() method executes
        // the clear() method
        // to clear the array for 
        // each thread operations
        Task.Run(() => clear());
  
        // call the function "print"
        print(sp);
          
    }
  
    public static void clear()
    {
        // delay for 10ms
        Task.Delay(10).Wait();
  
        lock(arr)
        // defines that one thread 
        // executes one task at one time
        {
            Array.Clear(arr, 0, arr.Length);
        }
    }
  
    // print function
    public static void print(Span span)
    {
        foreach(byte e in span)
        {
            Console.WriteLine(e);
            Task.Delay(10).Wait();
        }
    }
}

输出:

52
239
0
0

特性:

  • 当前:用于获取枚举器当前位置的项目的引用。

方法:

  • MoveNext():它将枚举数前进到Span 的下一项。

重要事项:

  • Span 提供对内存连续区域的类型安全访问。
  • 不能在异步方法中使用它。
  • 它不实现IEnumeratorIEnumerator 接口,因为Span 枚举器是ref struct
  • 它不包括Reset方法。
  • 敌人使用Reset()方法,它必须作为接口的一部分实现。
  • 它不包括其他堆分配。
  • 它不能用作泛型类型参数。
  • Span 提供对内存的读写访问。
  • ReadOnlySpan 提供对内存的只读访问。