首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2019-12-15-C#的span元素的优势场景在哪里

2019-12-15-C#的span元素的优势场景在哪里

作者头像
黄腾霄
发布2020-06-10 14:48:49
5500
发布2020-06-10 14:48:49
举报
文章被收录于专栏:黄腾霄的博客黄腾霄的博客

Span是C#7.0引入的,它旨在高效使用和管理一段连续的内存。


很多人第一次接触它的时候,想不出它的具体使用场景。

我第一次接触的时候就会想这个和数组使用有啥区别么?

首先看一个例子

static void Main(string[] args)
{
    var str = "123456";
    var array = str.ToCharArray();
    Console.WriteLine(array);
    var span = new Span<char>(array);
    AddOne(span);
    Console.WriteLine(array);
}

private static void AddOne(Span<char> span)
{
    for (var index = ; index < span.Length; index++)
    {
        var slice = span.Slice(index,);

        var value = (byte)span[index]+;
        slice.Fill((char)value);
    }
}

这里是将一个字符串的每一位数字加1

image-20191215155531968
image-20191215155531968

结果如图所示。

这个并没有体现span优势,但是如果我们现在期望只对原始字符串的某些子串进行处理呢?

很多人会想到使用substring,但是substring会返回一个新的字符串,这里就会增加内存开销。

那么使用数组如何?新建一个数组然后拷贝值过去,仍然是增加内存开销。

基于原数组处理呢?那就需要对AddOne方法添加重载,传入起始位置和长度。

那么span怎么做呢?如下图所示,使用slice切片即可

static void Main(string[] args)
{
    var str = "123456";
    var array = str.ToCharArray();
    Console.WriteLine(array);
    var span = new Span<char>(array);
    //传入一个slice即可
    AddOne(span.Slice(2,2));
    Console.WriteLine(array);
}

image-20191215160113211
image-20191215160113211

换言之Span的高效,不仅在于其只是一段连续内存的”视图”,而且,对于所有的处理方法可以和子集的处理方法统一API接口。(这里你可以类比下指针的功能,而span相对于指针的优势在于不需要length,而且内存可以GC)

这里对连续的内存对象的密集型操作是一个极大的优势

同JavaScript的ArrayBuffer比较

JavaScript中的ArrayBuffer和Span很相似,也是提供对一段内存处理的接口。阮一峰在ArrayBuffer - ECMAScript 6入门介绍他的来源是应用WebGL处理浏览器与显卡之间大量二进制数据的高效实时传输。

因此,我们可以推测,3D渲染,绘图,以及嵌入式开发等一些对效率和内存使用敏感的场景也都会是Span的用武之地


参考文档:


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/C-%E7%9A%84span%E5%85%83%E7%B4%A0%E7%9A%84%E4%BC%98%E5%8A%BF%E5%9C%BA%E6%99%AF%E5%9C%A8%E5%93%AA%E9%87%8C.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 同JavaScript的ArrayBuffer比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档