我正在为逗号分隔的流(网络)编写一个高性能的解析器。我的目标是直接从二进制解析和转换为 dotnet 原语。根据我迄今为止的测试,Span 的性能令人难以置信,但由于 ref 结构固有的限制,该类型很难使用。我遇到了一个障碍,试图找到一种有效的方法来存储在我的整个应用程序中使用的 Span 常量(逗号、换行符等)。似乎存在的唯一解决方案是将它们存储为
byte
并将它们转换为方法的类主体......或在每个方法主体中硬编码Span<byte> delimiter = Encoding.UTF8.GetBytes("\r\n")
。
以下是我想要实现的,但它给出了错误 - `CS8345 字段或自动实现的属性不能是 'Span' 类型,除非它是 ref 结构的实例成员。
public class Parser
{
Span<byte> NewLine = new byte[]{ (byte)'\n' };
}
必须有更好的方法!请帮忙!
您可以在 .NET 7 中使用
UTF-8 文字创建
ReadOnlySpan<byte>
:
class Consts
{
public static ReadOnlySpan<byte> Delim => "\n"u8;
}
或使用
Memory
/ReadOnlyMemory
:
public class Consts
{
public static ReadOnlyMemory<int> Type { get; } = new []{1};
}
和用法:
ReadOnlySpan<int> span = Consts.Type.Span;
或者将上述方法装饰成方法/表达式主体属性:
class Consts
{
private static readonly byte[] _delim = { (byte)'\n' };
public static ReadOnlySpan<byte> Delim => _delim;
}