【BeetleX重构】分享一个ArrayPool的扩展类

程序员有二十年 2024-05-22 20:09:33

开始重写BeetleX,在这个过过程中会分享设计和封装的一些简单功能代码。如果经常需要处理网络协议分析的朋友一定对这个类不陌生的,它用于提供缓冲区分配和回收的基础功能;使用它来解决大量new数组对象引起的空间分配和GC回收问题。

string email = "henryfan@msn.com";var bytes = ArrayPool<byte>.Shared.Rent(email.Length * 6);var len = Encoding.UTF8.GetBytes(email, 0, email.Length, bytes, 0);ArrayPool<byte>.Shared.Return(bytes);

以上是这个类的使用代码:Rent方法分配,Return方法回收;为了使用安全一般要这样写

string email = "henryfan@msn.com";var bytes = ArrayPool<byte>.Shared.Rent(email.Length * 6);try{ var len = Encoding.UTF8.GetBytes(email, 0, email.Length, bytes, 0);}finally{ ArrayPool<byte>.Shared.Return(bytes);}

虽然代码量是不多,但如果要频繁写这些代码还是很麻烦的!为了更简便的使用它扩展了这样一个结构

public struct TemporaryBuffer<T> : IDisposable{ public T[] Data { get; set; } public void Dispose() { ArrayPool<T>.Shared.Return(Data); } public static implicit operator TemporaryBuffer<T>(int length) { TemporaryBuffer<T> result = new TemporaryBuffer<T>(); result.Data = ArrayPool<T>.Shared.Rent(length); return result; }}

接下来看一下如何使用这个结构

using (TemporaryBuffer<byte> bytes = email.Length * 6){ var len = Encoding.UTF8.GetBytes(email, 0, email.Length, bytes.Data, 0);}

定义了这样一个结构后,只需要定义它并设置一个数值就自动分配内存了,这样用起来是不是方便很多了。通过简单重载一个转换符就可以实现更简洁的使用方式。

BeetleX

开源跨平台通讯框架(支持TLS)

提供HTTP,Websocket,MQTT,Redis,RPC和服务网关开源组件

个人微信:henryfan128 QQ:28304340

https://github.com/beetlex-io/

0 阅读:0

程序员有二十年

简介:感谢大家的关注