【发布时间】:2021-04-01 03:13:48
【问题描述】:
C# 字符串的 Splice 方法似乎将剩余部分复制到字符串数组中,而不仅仅是读取它们。 有没有相当于绕过复制的c++17 string_view?
对于那些不熟悉 string_view 的人,这里有一些背景信息。
来自微软的<string_view>:
string_view 系列模板特化提供了一种有效的方法,可以将只读、异常安全、非拥有句柄传递给序列的第一个元素位于位置零的任何类字符串对象的字符数据。 (...)
来自微软 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* 及其支持库与可利用的代码相关联,因为长度信息是数据的带内属性并且容易被篡改。此外,用于分隔长度的空值禁止嵌入空值,并导致最常见的字符串操作之一,即要求长度,与字符串长度成线性关系。
【问题讨论】:
-
我认为您正在寻找 Spans,但我不确定这是否 100% 正确。
-
File.ReadAllLines是关于从文件中读取内容。 -
从技术上讲,C# String 在某种意义上类似于 string_view,因为它是只读的
-
不,每个子字符串都是另一个不同的对象,因为 C# 中的字符串是不可变的