使用 Span<T> 作为 C# 类级变量

问题描述 投票:0回答:1

我正在为逗号分隔的流(网络)编写一个高性能的解析器。我的目标是直接从二进制解析和转换为 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' };
}

必须有更好的方法!请帮忙!

c# parsing utf-8 buffer system.memory
1个回答
1
投票

您可以在 .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;
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.