终于,主播也是用上博客园了,可喜可贺
来博客园不能不发文章,所以主播没事干先发个一篇看看实力
.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 GetSpan(nuint byteCount) => new DefaultNativeMemoryOwner(byteCount);
}
OK,非常完美,现在使用NativeMemoryGetter.GetSpan就可以方便的获取堆内存了
标签:Span,C#,ptr,NativeMemory,byteCount,INativeMemoryOwner,封装,public From: https://www.cnblogs.com/mliybs/p/18642830