.net core中的System.Buffers命名空间

 更新时间:2022年07月01日 11:23:48   作者:天方  
这篇文章介绍了.net core中的System.Buffers命名空间,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近研究了一下.net core 2.1的基础类库,发现它引入了一个System.Buffers名字空间,里面提供了一系列比较实用的对象,便简单的管中窥豹浏览一下。

ArrayPool<T>

ArrayPool<T>是一个数组类型的对象池,本身ArrayPoo<T>是一个抽象类,但他有一个默认的实现ArrayPoo<T>. Shared,使用方法如下:

var pool   = ArrayPool<byte>.Shared;
var buffer = pool.Rent(2048);
try
{
    //使用buffer
}
finally
{
    pool.Return(buffer);
    //归还buffer后不要再使用
}

方法比较简单:

  • 通过Rent从对象池中申请buffer
  • 使用完后,通过Return将buffer归还至对象池

微软的文档上并没有详细描述默认的ArrayPoo<T>的对象申请算法。

不过并不复杂,和传统的对象池的维护方式也差不多:

  • 系统维持着一个对象池
  • 调用Rent的时候,首先会到对象池中查看是否有合适的对象(至少要满足最小长度),如果有则直接返回对象池中的对象,并将其从对象池中移除
  • 调用Return时,将对象放置到对象池,从而可以作为下次Rent的候选对象

注:这里只记录了主要相关功能,实际算法比这个复杂。另外由于没有很详细看实现方式,如要描述不正确的地方欢迎指正

也就是说,return后的对象,很可能被别的地方rent走,因此可能导致读写冲突。(类似于c语言中的野指针,但仍然是安全的,不会造成内存错误)

MemoryPool<T>

除了ArrayPool外,System.Buffers名字空间下还提供了一个MemoryPool,它的使用方式和ArraPool比较类似,基本示例如下:

var pool   = MemoryPool<byte>.Shared;
var buffer = pool.Rent(2048);
try
{
    var memory = buffer.Memory;
    //use Memory<byte>
}
finally
{
    buffer.Dispose();
}

整个过程还是非常类似的,不过释放的时候是调用的Dispose方法,用起来实际要更加方便点。不过这里申请到的是Memory<T>对象,可能有的地方不像byte[]那样适用 。

关于MemoryPool的实现,我在github上找了一下,还没有看到。不过由于它返回的是Memory<T>,理论上来讲应该是有更高的效率。(例如,可以把一个大段的buffer分成多个memory返回,从而减少申请新对象)

BinaryPrimitives

BinaryPrimitives位于System.Buffers.Binary名字空间下,它提供了一系列数字和字节互相转换的函数。

它的主要好处是是提供了常用BigEndian类型的数字的支持,在网络编程或者文件解析的方式的时候非常实用,免得造轮子了。

Utf8Parser、Utf8Formatter和Base64

这三个类位于System.Buffers.Text下,它主要用于utf8编码和base64编码下的常用类型的读写,如datetime,guid,bool等,并且支持常用的序列化方式。。

到此这篇关于System.Buffers命名空间的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • FileStreaReder和StreamReader两个类介绍

    FileStreaReder和StreamReader两个类介绍

    由于最近需要对文件进行处理,所以看了一下MSDN的System.IO读取文件的两个类。下面对两个类简单的整理一下
    2012-04-04
  • .Net创建型设计模式之工厂方法模式(Factory Method)

    .Net创建型设计模式之工厂方法模式(Factory Method)

    这篇文章介绍了.Net设计模式之工厂方法模式(Factory Method),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 部署ASP.NET Core程序到Windows系统

    部署ASP.NET Core程序到Windows系统

    这篇文章介绍了部署ASP.NET Core程序到Windows系统的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • 通过VS中的数据源选择对话框简单实现数据库连接配置

    通过VS中的数据源选择对话框简单实现数据库连接配置

    通过VS中的数据源选择对话框简单实现数据库连接配置...
    2007-02-02
  • 给.net初学者的一些建议(共勉之)

    给.net初学者的一些建议(共勉之)

    给.net初学者的一些建议(共勉之)...
    2006-09-09
  • .NET 6更新使.NET生态系统蜕变

    .NET 6更新使.NET生态系统蜕变

    微软正式发布.NET最新长期支持版本.NET 6,这个版本的更新重点,除了C#和F#都有许多语言功能改进之外,.NET 6终于集大成,成为跨浏览器、云计算、桌面、物联网和移动应用程序的统一平台,性能也获得大幅提升,并且更完整支持Arm64
    2022-01-01
  • ASP.Net Core MVC基础系列之环境设置

    ASP.Net Core MVC基础系列之环境设置

    这篇文章介绍了ASP.Net Core MVC环境设置的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • asp.net中的cookie使用介绍

    asp.net中的cookie使用介绍

    asp.net中的cookie使用介绍,这里脚本之家将一些asp.net中的cookie操作方法整理下,需要的朋友可以参考下
    2012-05-05
  • .Net结构型设计模式之享元模式(Flyweight)

    .Net结构型设计模式之享元模式(Flyweight)

    这篇文章介绍了.Net结构型设计模式之享元模式(Flyweight),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 利用C#远程存取Access数据库

    利用C#远程存取Access数据库

    目前,基于数据库服务器的桌面管理程序和Web程序已经有太多的应用了,尤其是网络的大量普及,孤立地数据库管理系统无法胜任分布式管理应用,但是面对基于Access数据库的现有的桌面应用我们也无法完全的摒弃。我们利用.Net 远程处理功能将连接和存取Access的行为封装为一个远程对象,供网络中其它客户端通过调用该远程对象来存取实际的Access数据库。我们以 C# 2005 为开发语言来实现上述功能。
    2008-04-04

最新评论