【C#随笔】封装一下NativeMemory类

终于,主播也是用上博客园了,可喜可贺

来博客园不能不发文章,所以主播没事干先发个一篇看看实力

.NET6的时候引入了一个新类,叫NativeMemory,里面提供了Alloc Free等方法作为malloc和free的包装

想当年我写非托管内存的时候都是Marshal类起手,居然写了这么久才发现早就有了这玩意,那不得封装一下

首先,NativeMemory的方法直接与指针交互,都不是nint类型,必须得开允许不安全代码

接下来我打算模仿一下.NET自带的IMemoryOwner接口写一个INativeMemoryOwner接口

public interface INativeMemoryOwner : IDisposable
{
    Span<byte> Span { get; }
}

很好,有了接口,我们现在还得需要一个静态类和实现类,主播不会起名字,随便起两个名字吧

public static class NativeMemoryGetter
{
    private unsafe class DefaultNativeMemoryOwner : INativeMemoryOwner
    {
        private int byteCount;
        private void* ptr;
        public DefaultNativeMemoryOwner(nuint byteCount)
        {
            this.byteCount = (int)byteCount;
            ptr = NativeMemory.Alloc(byteCount);
        }

        public Span<byte> Span => new Span<byte>(ptr, byteCount);

        public void Dispose() => NativeMemory.Free(ptr);
    }

    public static INativeMemoryOwner Rent(nuint byteCount) => new DefaultNativeMemoryOwner(byteCount);
}

OK,非常完美,现在使用NativeMemoryGetter.GetSpan就可以方便的获取堆内存了

posted @   Mliybs翠鸟  阅读(69)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示