是否有等效于 c++17 string_view 的 c#?

时间:2021-04-01 03:13:48

标签: c# c++ string

C# 字符串的 Splice 方法似乎将剩余部分复制到字符串数组中,而不仅仅是读取它们。 是否有等效于绕过复制的 c++17 string_view?


对于那些不熟悉 string_view 的人,这里有一些背景信息。

来自微软的<string_view>

<块引用>

string_view 模板特化系列提供了一种有效的方法,可以将只读、异常安全、非拥有的句柄传递给任何字符串类对象的字符数据,其中序列的第一个元素位于零位置。 (...)

来自 Microsoft 的 C++ 团队博客 std::string_view: The Duct Tape of String Types

<块引用>

string_view 解决了“每个平台和库都有自己的字符串类型”的参数问题。它可以绑定到任何字符序列,因此您可以将函数编写为接受字符串视图:

void f(wstring_view); // string_view that uses wchar_t's

并调用它而不关心调用代码使用的是什么字符串类型(并且 > for (char*, length) 参数对只需在它们周围添加 {})

来自 StackOverflow 的 What is string_view?

<块引用>

任何和所有类型的“字符串引用”和“数组引用”提议的目的是避免复制已经在其他地方拥有的数据并且只需要非变异视图。有问题的 string_view 就是这样一种提议;也有较早的称为 string_ref 和 array_ref 的。

这个想法总是存储一对指向第一个元素的指针和一些现有数据数组或字符串的大小。

这样的视图句柄类可以廉价地按值传递,并提供廉价的子串操作(可以通过简单的指针增量和大小调整来实现)。 (...)

同样来自 std::string_view: The Duct Tape of String Types 的以下内容与问题无关,但对 C# 开发人员来说应该很有趣:

<块引用>

今天,用于传递字符串数据的最常见的“最小公分母”是以空字符结尾的字符串(或者按照标准的说法,以空字符结尾的字符类型序列)。这早在 C++ 之前就已经存在了,并提供了干净的“平面 C”互操作性。但是,char* 及其支持库与可利用代码相关联,因为长度信息是数据的带内属性,容易被篡改。此外,用于分隔长度的空值禁止嵌入空值,并导致要求长度的最常见字符串操作之一与字符串长度成线性。

1 个答案:

答案 0 :(得分:2)

from bs4 import BeautifulSoup html = """ <html> <style> @font-face {font-family:"MS Mincho"} </style> </html> """ soup = BeautifulSoup(html, "html.parser") soup.select_one("style").append('@font-face\n{font-family:"MS Gothic"}') print(soup) 可以工作。

看看All About Span: Exploring a New .NET Mainstay

<块引用>

Span 的第二个变体,称为 System.ReadOnlySpan,支持只读访问。这种类型与 Span 类似,不同之处在于它的索引器利用 C# 7.2 的一项新功能返回“ref readonly T”而不是“ref T”,使其能够处理不可变数据类型,如 System.String。 ReadOnlySpan 使得在不分配或复制的情况下对字符串进行切片非常有效,如下所示:

ReadOnlySpan

字符[]

这不是您要问的直接问题,但您可以将数据组织为字符数组。

相关问题