您现在的位置是:网站首页> 编程资料编程资料
.net core中的System.Buffers命名空间_基础应用_
2023-05-24
243人已围观
简介 .net core中的System.Buffers命名空间_基础应用_
最近研究了一下.net core 2.1的基础类库,发现它引入了一个System.Buffers名字空间,里面提供了一系列比较实用的对象,便简单的管中窥豹浏览一下。
ArrayPool
ArrayPool
var pool = ArrayPool.Shared; var buffer = pool.Rent(2048); try { //使用buffer } finally { pool.Return(buffer); //归还buffer后不要再使用 }
方法比较简单:
- 通过Rent从对象池中申请buffer
- 使用完后,通过Return将buffer归还至对象池
微软的文档上并没有详细描述默认的ArrayPoo
不过并不复杂,和传统的对象池的维护方式也差不多:
- 系统维持着一个对象池
- 调用Rent的时候,首先会到对象池中查看是否有合适的对象(至少要满足最小长度),如果有则直接返回对象池中的对象,并将其从对象池中移除
- 调用Return时,将对象放置到对象池,从而可以作为下次Rent的候选对象
注:这里只记录了主要相关功能,实际算法比这个复杂。另外,由于没有很详细看实现方式,如要描述不正确的地方欢迎指正
也就是说,return后的对象,很可能被别的地方rent走,因此可能导致读写冲突。(类似于c语言中的野指针,但仍然是安全的,不会造成内存错误)
MemoryPool
除了ArrayPool外,System.Buffers名字空间下还提供了一个MemoryPool,它的使用方式和ArraPool比较类似,基本示例如下:
var pool = MemoryPool.Shared; var buffer = pool.Rent(2048); try { var memory = buffer.Memory; //use Memory } finally { buffer.Dispose(); }
整个过程还是非常类似的,不过释放的时候是调用的Dispose方法,用起来实际要更加方便点。不过这里申请到的是Memory
关于MemoryPool的实现,我在github上找了一下,还没有看到。不过由于它返回的是Memory
BinaryPrimitives
BinaryPrimitives位于System.Buffers.Binary名字空间下,它提供了一系列数字和字节互相转换的函数。

它的主要好处是是提供了常用BigEndian类型的数字的支持,在网络编程或者文件解析的方式的时候非常实用,免得造轮子了。
Utf8Parser、Utf8Formatter和Base64
这三个类位于System.Buffers.Text下,它主要用于utf8编码和base64编码下的常用类型的读写,如datetime,guid,bool等,并且支持常用的序列化方式。。
到此这篇关于System.Buffers命名空间的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
相关内容
- .net中的Span<T>类和Memory<T>类介绍_基础应用_
- Rx.NET库中IDisposable对象的用法_实用技巧_
- .net中的DI框架AutoFac简单介绍_实用技巧_
- Asp.net core利用dynamic简化数据库访问_实用技巧_
- Asp.net core实现PushStream视频流推送_实用技巧_
- 在Asp.net core中实现websocket通信_实用技巧_
- 使用.NET Core创建exe应用程序_实用技巧_
- .Net弹性和瞬态故障处理库Polly实现执行策略_实用技巧_
- .Net弹性和瞬态故障处理库Polly实现弹性策略_实用技巧_
- .Net弹性和瞬态故障处理库Polly介绍_实用技巧_
