Span 提供任意内存的连续区域的类型安全和内存安全表示形式。它是在堆栈而不是托管堆上分配的ref结构,是对任意内存块的抽象。
1.关于Span
-
在NET Core 2.1中首次引入
-
提供对任意内服务器托管网存上的连续区域的读写视图
- 利用索引/迭代来修改范围内的内存
- 几乎无开销
2.和内存的关系
Span 表示任意内存的连续区域。Span实例通常用于保存数组的元素或数组的一部分。 但是,与数组不同, Span实例可以指向堆栈上托管的内存、本机内存或托管的内存。
3.性能测试
Span通常用来处理数组,所以本次测试的场景是数组的切分:从一个数组的中间元素开始,获取并返回四分之一个元素。
3.1数组初始化
这里我们准备一个数组分三种不同长度进行初始化,有利于覆盖到更多的测试情况。
3.2 测试采用三种方式,用BenchmarkDotNet比较一下:
第一种(常规):
第二种(复制):
第三种(Span切片):
性能测试结果如下,可以看到Span的速度是很快的,且不占内存。
4. 切片
Span.Slice()方法就是对内存进行切片,第三种方法区别于前两种,本质上不创建和销毁对象,可以认为是做到了内存0分配
5. ReadOnlySpan
ReadOnlySpan是Span的只读表示形式,通常用在string的切片(因为string的不可变性)
6. Span局限性
-
Span是仅限存活在堆栈上的值类型
-
Span不能是非堆栈类型的字段
-
Span不能被装箱
-
Span不能是异步方法的参数服务器托管网或局部变量
-
Span不能被lambda表达式捕获
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
不多说,直接上干货 使用逻辑非运算符 ! 和双重逻辑非运算符 !!:例如 ![]、!![]、!0、!!0 和 !””、!!””。 空字符串的转换:!”” 和 !!””。 数组和对象的类型转换:[] + []、[] – []、{} + [] 和 [] + {}。…