Подстрока без какого-либо выделения с использованием Span <T> - PullRequest
0 голосов
/ 12 ноября 2018

Как мы можем использовать 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);

Но я нигде не мог найти, делается ли это путем выделения в куче или нет.

1 Ответ

0 голосов
/ 12 ноября 2018

Как вам хорошо известно, System.String является неизменным . Нет, но если нет. Если у вас есть Span<char> и вы хотите рассматривать их как string, будет выделена новая память.

Хорошей новостью является то, что с введением Span<>, многие встроенные методы в фреймворке были обновлены, чтобы принимать его , в дополнение к принятию строк и массивов. Цитируя эту статью MSDN (я добавил ссылки на некоторые примеры):

.. многие такие методы были добавлены в рамках. С System.Random до System.Text.StringBuilder до System.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<> напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...