首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在String.Create核心2.1中使用.NET的示例

如何在String.Create核心2.1中使用.NET的示例
EN

Stack Overflow用户
提问于 2019-02-08 17:44:29
回答 1查看 7.8K关注 0票数 17

有人知道如何使用此方法吗?文档有点“轻”!

代码语言:javascript
复制
public static string Create<TState> (int length, TState state, System.Buffers.SpanAction<char,TState> action);

https://learn.microsoft.com/en-us/dotnet/api/system.string.create?view=netcore-2.2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-08 18:12:50

方法需要三件事:

  1. 字符串的最终length。您必须事先知道这一点,因为该方法需要它为用于构造最终字符串的Span<char>实例安全地创建一个内部固定长度缓冲区。
  2. 数据(state),它将成为您的字符串。例如,您可能有一个数组缓冲区(比如说,通过网络接收的ascii整数),但是它可以是任何东西。这是将被转换为最终字符串的原始数据。有一个隐藏在这篇MSDN文章中的示例甚至使用了Random实例。我还看到了一个不完整的示例,用于创建位图图像的基-64编码哈希值(固定长度)(可变大小的state输入),但遗憾的是,我无法再次找到它。
  3. action lambda函数,它将state转换为最终字符串的字符。Create()方法将调用此函数,将它为字符串和state数据创建的内部Span<char>作为参数传递。

对于一个非常简单的例子,我们可以从这样的字符数组中Create()一个字符串:

代码语言:javascript
复制
char[] buffer = {'f', 'o', 'o'};
string result = string.Create(buffer.Length, buffer, (chars, buf) => {
    for (int i=0;i<chars.Length;i++) chars[i] = buf[i];
});

当然,基本的string(char[])构造函数也可以在这里工作,但这说明了正确的函数可能是什么样的。或者,我们可以将ascii int值数组映射到如下所示的新字符串:

代码语言:javascript
复制
int[] buffer = {102, 111, 111};
string result = string.Create(buffer.Length, buffer, (chars, buf) => {
    for (int i=0;i<chars.Length;i++) chars[i] = (char)buf[i];
});

该功能之所以存在,是因为与传统方法相比,该技术具有显著的潜在性能优势。例如,与将流读入缓冲区不同,您可以直接将Stream对象传递给String.Create() (假设您知道最终长度)。这就避免了需要分配单独的缓冲区,也避免了一轮复制值(stream=>buffer=>string变成了stream=>string)。

调用string.Create()时,函数会分配一个新字符串,该字符串的大小已经由length参数确定。这是一个(而且只有一个)堆分配。因为Create()是字符串类型的成员,所以它可以访问这个您和我通常看不到的新对象的私有字符串数据。它现在使用此访问来创建指向新字符串的内部字符数据的内部Span<char>实例。

Span<char>驻留在堆栈上,但对来自新字符串的堆内存起作用.没有额外的分配,而且一旦Create()函数返回,它就完全超出了范围,所以一切都是合法和安全的。而且因为它基本上是一个有好处的指针,除非你做了其他可怕的错误,否则几乎没有溢出堆栈的风险。

现在,Create()调用您的action函数来完成填充字符串的繁重工作。你的action能写进Span<char>..。在lamdba执行过程中,字符串不像您可能听到的那样不可变!

action lamdba完成后,Create()可以返回新的、现成的字符串引用.一切都很好:我们最小化了堆分配、保存的类型安全和内存安全;Span<char>在任何地方都无法访问,并且作为堆栈值已经被销毁。根据您的action实现,我们还减少了缓冲区之间不必要的复制。

票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54597722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档