七、Span<T>

本文深入探讨了C#中的Span类型,包括它如何引用托管堆、堆栈和本机堆上的内存。Span不能被装箱,不能作为数组项或静态字段,也不能作为泛型类型参数。示例展示了如何使用stackalloc创建栈上的Span,以及如何利用Marshal类在本机堆上分配内存并创建Span。此外,还介绍了与Span配合使用的扩展方法,如Overlaps、Reverse和IndexOf。
摘要由CSDN通过智能技术生成

第3章介绍了创建引用类型(类)和值类型(结构)。类的示例存储在托管堆上。结构的值可以存储在堆栈上,或者当使用装箱时,可以存储在托管堆上。现在我们有了另一种类型:一种只能在堆栈上存储其值的类型,而不会在堆上存储,有时称为类ref类型。这种类型的装箱是不可能的。这样的类型用ref struct关键字声明。使用ref struct提供了一些额外的行为和限制。限制如下:

  • 它们不能添加为数组项。
  • 它们不能用作泛型类型参数。
  • 它们不能装箱。
  • 它们不能是静态字段。
  • 它们只能是类ref类型的实例字段。

在本节中,Span<T>和ReadOnlySpan<T>是类似于ref的类型。这些类型已经在讨论数组扩展方法的第7章中介绍了,在第9章中介绍了字符串的扩展方法。这里介绍的附加特性包括在托管堆、堆栈和本机堆上引用数据。

1. Span引用托管堆

Span可以引用托管堆上的内存,如第7和第9章所示。在下面的代码片段中,创建了一个数组,并使用扩展方法AsSpan创建了一个新的Span,它引用托管堆上的数组的内存。创建在变量span1中引用的Span之后,创建Span的一个切片,其中用值42填充。下一个Console.WriteLine将span1的值写入控制台:


        static void SpanOnTheHeap()
        {
            System.Console.WriteLine(nameof(SpanOnTheHeap));
            Span<int> span1 = (new int[]{1,5,11,71,22,19,21,33}).AsSpan(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值