StringSegment类的目的是什么?

17
Microsoft.Extensions.Primitives 包库中,有一个名为 StringSegment 的类,注释表明它是“子字符串的优化表示”。我之前不知道这个特殊的类,直到我发现 aspnet announcement #244,其中提到:“Microsoft.Net.Http.Headers 转换为使用 StringSegments”。
然而,查看 StringSegment 的实现 类时,我没有看到它实际上有什么用处。我看到了一个缓冲区,我猜这可能会更好地操作部分字符(也许是“段”部分?)。我还看到了几个帮助函数,它们与常规字符串中已经可用的函数(如 StartsWith/Endswith、Substring 等)在行为上非常相似 - 如果不是完全相同的话。aspnet-core docs 列出了这些内容,但同样缺乏“为什么”应该使用它的上下文。

那么,StringSegment类的目的是什么?在哪些场景下适合使用它?

当我操作字符串时,在我的应用程序代码中调用这个类是否有用?我们能否举一个例子,说明它的优点?


好的,HTTP 头是一个很好的例子。它们必须被解析,但客户端代码很少会对其感兴趣。因此,懒惰生成它们可以避免大量的垃圾回收。 - Hans Passant
@HansPassant,你不需要使用StringSegment。在这种情况下,当获取请求的Headers属性时,可以直接解析标头。如果创建StringSegments,那么你将不必要地为所有字符串段创建所有对象。 - Servy
2个回答

12

它允许您在另一个字符串的子字符串上执行各种字符串操作,而不需要实际调用Substring()并创建新的字符串对象。这大致类似于C语言中可以将指针指向字符串中间的方式。


1
不,如果他们在每个子字符串上调用值一次,他们仍然没有从中受益。该类的整个目的是您应该每个实例调用它少于一次,理想情况下显着少,否则您应该只使用常规子字符串。 - Servy
@Servy 如果“deferred”被理解为一定会被调用,那不是我想要的词语 - 但我完全想不出更好的术语了。 - 15ee8f99-57ff-4f92-890c-b56153
你似乎还没有理解这个类型的目的。如果你只是想推迟对 Substring 的调用,那么你只需要一个调用 SubstringFunc<string>;没有必要创建一个新类型来实现这一点。整个重点是在其上执行操作,并将其作为有意义的值实际消耗,而从未将其解析为字符串。如果你不这样做,就没有使用该类型的理由。 - Servy
@Servy 是什么类型的操作? - 15ee8f99-57ff-4f92-890c-b56153
看看它的所有方法。除了 ToString 之外的任何一个方法都可以。(还有除了 Value 之外的任何属性。) - Servy
显示剩余6条评论

1

在解析文本时,可能会创建或复制许多新的字符串对象。该类理论上将有助于减少处理大型子字符串时使用的内存。其他语言也有类似的概念(请参见 C++17 中的 std::string_view)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接