有没有替代ReadOnlyMemory<T>的方法来允许访问底层存储中的索引?(ReadOnlyMemory<T>._index是私有的).

我有一个记号器,它把ReadOnlyMemory<char>个源分割成记号.每个令牌也有一个ReadOnlyMemory<char>来表示源的一部分.这可以很好地工作,但我有一个解析器,它使用记号赋值器,需要创建跨越多个记号的原始源的新片段(例如,从一个记号的开始到另一个记号的结尾).

我的解决办法是让令牌引用Range而不是ReadOnlyMemory<char>,但这会使其他客户端的令牌器更加复杂,并使调试令牌器变得更加困难.我正在考虑为这个场景创建我自己的ReadOnlyMemory<T>的替代品,但有几个方面使它变得不那么简单.

推荐答案

ReadOnlyMemory<T>已经通过各种MemoryMarshal.TryGet*个API公开了内部 struct .您需要分别处理3种不同的场景:

  • 数组(TryGetArray)
  • 字符串(仅适用于<char>TryGetString)
  • 自定义内存实现(TryGetMemoryManager)

对于任何有效的内存块,其中一个应该报告true.

但是:如果这些令牌跨越不同的内存块,您might需要的是ReadOnlySequence<T>,它概括了discontiguous个缓冲区;这是basically,要么是单个ReadOnlyMemory<T>(或类似的),要么是一个链接列表链,其中每个元素都有ReadOnlyMemory<T>.您需要自己构建链(在多段的情况下),但是:这是微不足道的.

还请注意,大多数使用ReadOnlySequence<T>的代码应该判断IsSingleSegment,并针对单跨距情况进行优化-因为这种情况非常频繁,而且通常使用起来要高效得多.

Csharp相关问答推荐

Blazor:用参数创建根路径

使用LayoutKind在C#中嵌套 struct .显式

在一个模拟上设置一个方法,该模拟具有一个参数,该参数是一个numc函数表达式

在路由中使用枚举

如何在ASP.NET Core8中启用REST应用程序的序列化?

按需无缝转码单个HLS数据段

链接到字典字符串.拆分为(.Key,.Value)

用于获取字符串的最后12个字符的正则表达式(空格除外)

使用未赋值的、传递的局部变量

错误:此版本的Visual Studio无法打开以下项目

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

工厂类是如何在.NET 8中注册的?

为什么Swashbakle/Swagger在参数中包含变量名?

并发表更新.EF核心交易

在C#和HttpClient中使用REST API

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

SignalR跨域

这是T自身的布尔表达式是什么意思?

Windows 10上埃及标准时间的时区偏移不正确

MudBlazor MudTabs-->;选项卡内容高度