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

        开始重写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);
}

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

BeetleX

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

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

个人微信:henryfan128    QQ:28304340

关注公众号

b0a394cc34cb09cd618cff42e4154b25.jpeg

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值