【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 @ 2024-12-31 14:29  Mliybs翠鸟  阅读(177)  评论(2)    收藏  举报