Я осуществляю рефакторинг библиотеку, которой мы в настоящее время пользуемся, и я сталкиваюсь со следующей проблемой.
Мы раньше имели следующий материал:
class Blah
{
float[][] data;
public float[] GetDataReference(int index)
{
return data[index];
}
}
По различным причинам я заменил эту зубчатую версию массива 1 размерной версией массива, связав внутренние массивы. Мой вопрос: как я могу все еще возвратить ссылку на sub массив data
?
class Blah
{
float[] data;
int rows;
public float[] GetDataReference(int index)
{
// Return a reference data from offset i to offset j;
}
}
Я думал, что небезопасный материал и материал указателей могут быть полезными, действительно ли это выполнимо?
Нет, вы не можете этого сделать, но вместо этого вам следует использовать ArraySegment
.
Обратите внимание, что объект массива состоит из метаданных о его длине и т. Д., А затем из самих данных. Если вы понимаете, что я имею в виду, вы не можете создать фрагмент существующего массива и по-прежнему иметь метаданные рядом с данными - должен быть дополнительный уровень косвенного обращения (что и является тем, что ArraySegment
обеспечивает).
(Я немного удивлен, что ArraySegment не выполняет больше обертываний, например, реализуя IList
, но мы идем. Было бы достаточно легко создать такую структуру, если бы вы хотели to.)
Проверьте следующий вопрос по SO, но не используйте принятый ответ (в конце концов, вы не хотите копировать), а следуйте другие варианты использования перечислителя для среза / части исходного массива.