【问题标题】:Is there a c# equivalent of c++17 string_view?是否有与 c++17 string_view 等效的 c#?
【发布时间】: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# 中的字符串是不可变的

标签: c# c++ string


【解决方案1】:

ReadOnlySpan 可以工作。

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

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

string str = "hello, world";
string worldString = str.Substring(startIndex: 7, length: 5); // Allocates
ReadOnlySpan<char> worldSpan =
 str.AsSpan().Slice(start: 7, length: 5); // No allocation
Assert.Equal('w', worldSpan[0]);
worldSpan[0] = 'a'; // Error CS0200: indexer cannot be assigned to

字符[]

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

【讨论】:

  • "string_view" 所做的几行(对于那些像我一样不是 C++ 专家的人)是我正在寻找的(阅读文档确实看起来类似于 C# 中的 Spans,但因为我没有在 C++ 中使用它,不知道它们在实践中是如何使用的)。还要考虑是否可以编辑 ReadAllLines 句子以在问题的上下文中有意义(我的理解是 C++ 也没有在多个字符串上提供“spans”/“view” - 所以不太确定字符串数组与 string_view 的关系类型)..
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 2017-01-01
  • 2023-03-30
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多