我计划使用一种基本上类似于
的数据结构public readonly struct Wrapper //: IDisposable, IEquatable<Wrapper>, ...
{
/// <summary>
/// The actual data.
/// </summary>
private IMemoryOwner<byte> Data { get; }
public Wrapper(IMemoryOwner<byte> data)
{
Data = data;
}
public Wrapper(ReadOnlyMemory<byte> data)
{
Data = data;
}
}
包装可能使用MemoryPool<byte>
池化的,因此具有IMemoryOwner
或ArrayPool<byte>
类型或与var someData = new byte[0];
一起分配的内存。
这个想法是为了提供一种更方便的访问方式,该访问方式是临时分配或从某种类型的池中租用的字节块。该字节数据将具有某些模式(已在构造函数中检查),并且长度可能有所不同。
使用IMemoryOwner
或ReadOnlyMemory
表示拥有数据所有权并进行处置会在租赁时将其返回到池中,因此从这种角度看,这种设计似乎是正确的。
但是我是否忽略了某些东西,因为将ReadOnlyMemory
变成IMemoryOwner
似乎并不简单?如何实现?
ReadOnlyMemory<byte>
捕获了不可变内存存储区的意图,但是除了作为构造函数参数提供时假定拥有它的所有权之外,谁不拥有该内存。
IMemoryOwner
,并且可能实现一个自定义的内存池。
答案 0 :(得分:0)
在这里似乎选择使用自定义池。具体来说,NonAllocatingPool<T> : MemoryPool<T>
是y = 20
x = ('percentage: %i', 20)
x = f'percentage: {y}'
的选择。