.Net Core中内存的连续区域Span与部分数组ArraySegment

在.Net Core中,一个 Span<T> 表示任意内存的连续区域。 Span<T> 实例通常用于保存数组或某个数组的一部分的元素。 但与数组不同,Span<T> 实例可以指向托管内存、本机内存或在堆栈上管理的内存。可以认为是一个T类型的安全指针。Span<T>是一种高性能的数组操作。

可以将部分数组ArraySegment<T> 隐式转换为 内存的连续区域Span<T>

一、新建.net core控制台应用程序DotCoreDemo,目标框架选择 .Net Core 3.1。

键入如下测试代码:

using System;
using System.Linq;

namespace DotCoreDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * .NET Core官方文档
             * https://docs.microsoft.com/zh-cn/dotnet/core/
             * .NET Core 是一个通用的开放源代码开发平台。 可以使用多种编程语言针对 x64、x86、ARM32 和 ARM64 处理器创建适用于 Windows、macOS 和 Linux 的 .NET Core 应用。 
             * 为云、IoT【物联网(The Internet of Things,简称IOT】、客户端 UI 和机器学习提供了框架和 API。
             * 一个 Span<T> 表示任意内存的连续区域。 Span<T> 实例通常用于保存数组或某个数组的一部分的元素。 但与数组不同,Span<T> 实例可以指向托管内存、本机内存或在堆栈上管理的内存。
            */
            int[] array = new int[] { 8, 4, 3, 5, 9 };
            Span<int> span = new Span<int>(array);
            int sum = 0;
            for (int i = 0; i < span.Length; i++)
            {
                sum += span[i];
            }
            Console.WriteLine($"使用Span【内存的连续区域】来测试:Sum={sum}");
            ArraySegment<int> segment = new ArraySegment<int>(array);
            Console.WriteLine($"使用ArraySegment【数组的一部分】来测试:Sum={segment.Sum()}");

            Span<int> implictSpan = segment;
            Console.WriteLine("可以将部分数组ArraySegment 隐式转换为 内存的连续区域Span");
            Console.WriteLine("获取内存的一部分,从第2个开始");
            Span<int> sliceSpan = implictSpan.Slice(2);//Slice:从指定的索引开始切片
            Console.WriteLine("遍历Slice切片后的元素:");
            foreach (int item in sliceSpan)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine($"Slice切片后的元素之和:{sliceSpan.ToArray().Sum()}");
            Console.ReadLine();
        }
    }
}

二、程序运行如图:

.Net Core中内存的连续区域Span与部分数组ArraySegment