Спан из массива - непонятно
От: Vladek Россия Github
Дата: 07.11.21 19:51
Оценка:
Нужен мне был отрезок со смещением Span<char> из массива, который я заполнял данными отдельно, и потом уже работал с целым массивом. Спан я получал так:
private char[] buffer;

public Span<char> AsSpan()
{
    return new Span<char>(buffer, this.offset, this.buffer.Length - this.offset);
}

и всё работало — массив заполнялся данными извне.

Потом я решил эту строчку поменять:
private char[] buffer;

public Span<char> AsSpan()
{
    return this.buffer[this.offset..];
}

и всё перестало работать — массив остаётся пустым!

Что же делает второй вариант, неужели создаёт копию массива вместо возвращения отрезка из моего оригинального массива?

Кстати, в классе MemoryExtensions есть такой же метод, но он похитрее моего — чем он лучше?
Re: Спан из массива - непонятно
От: Jack128  
Дата: 07.11.21 20:15
Оценка: 8 (1)
Здравствуйте, Vladek, Вы писали:

V>Что же делает второй вариант, неужели создаёт копию массива вместо возвращения отрезка из моего оригинального массива?


Да
Re: Спан из массива - непонятно
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.11.21 05:11
Оценка: 12 (2)
Здравствуйте, Vladek, Вы писали:

V>public Span<char> AsSpan()

V>{
V> return this.buffer[this.offset..];
V>}
V>[/cs]
V>и всё перестало работать — массив остаётся пустым!
V>Что же делает второй вариант, неужели создаёт копию массива вместо возвращения отрезка из моего оригинального массива?

Именно. Делайте
public Span<char> AsSpan() => this.buffer.AsSpan().Slice(this.offset);
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Спан из массива - непонятно
От: Vladek Россия Github
Дата: 08.11.21 11:12
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, Vladek, Вы писали:


V>>Что же делает второй вариант, неужели создаёт копию массива вместо возвращения отрезка из моего оригинального массива?


J>Да


офигеть, а я был уверен — это просто арифметика с указателями. Теперь надо смотреть где ещё я код так же "упростил".

Где про эту особенность для обычных массивов в документации упоминается?
Re: Спан из массива - непонятно
От: Mr.Delphist  
Дата: 08.11.21 11:13
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Кстати, в классе MemoryExtensions есть такой же метод, но он похитрее моего — чем он лучше?


Не сказать что лучше — юзает Unsafe, т.е. через указатели память привязывается. Но... он работает!
Re[3]: Спан из массива - непонятно
От: Jack128  
Дата: 08.11.21 12:16
Оценка:
Здравствуйте, Vladek, Вы писали:

V>офигеть, а я был уверен — это просто арифметика с указателями.


Во всех типах, где есть индексатор с параметром Range — этот индексатор возвращает тот самый же тип. То есть myString[..] вернет строку, mySpan[..] — вернет Span, myArray[..] вернет массив. Очевидно что это должен быть другой массив, с другой длиной.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.