.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();
}
}
}
二、程序运行如图: