繁体   English   中英

子串,不使用Span进行任何分配<T>

[英]Substring Without any Allocation Using Span<T>

我们如何使用Span<T>代替string.Substring来消除堆分配的必要性? 假设我们有以下代码:

var firstNameAndFamilyName="myname,myfamily";
var span = firstNameAndFamilyName.AsSpan().Slice(0,6);
var firstName = .... //  How can I get 'myname' without allocating any new memory on the heap?

请注意,我知道字符串"myname,myfamily"位于堆上,并且firstName需要指向堆中的某个位置。 我的问题是,我们如何指向一个字符串的子集而不将那部分对应到堆内存的新位置?

我知道一个新的构造函数已添加到String类,该类接受ReadOnlySpan<T>

var firstName = new string(span);

但是我找不到任何地方是否通过在堆上分配来完成。

如您所知, System.String 是不可变的 不,但是,如果。 如果您有Span<char>并想将它们视为string ,则会分配新的内存。

好消息是,随着Span<>的引入,除接受字符串和数组之外, 框架中的许多内置方法也已更新为可以接受。 引用此MSDN文章 (我已添加了一些示例的链接):

..许多这样的方法已在整个框架中添加。 System.RandomSystem.Text.StringBuilderSystem.Net.Sockets ,都添加了重载,以使{ReadOnly}Span<T>{ReadOnly}Memory<T>变得简单而高效。

这还包括所有数字{Try}Parse(string)方法,这些方法现在将具有相应的(ReadOnlySpan<char>) 重载

var str = "123,456";
var span = str.AsSpan(0,3);
var i = int.Parse(span);

因此,不要从范围内获取string ,而要查看您要实现的目标是否可以直接利用Span<>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM