Подтвердить что ты не робот

Свойство Set Array Length

Можно ли изменить свойство длины массива с помощью некоторой техники?

Мне нужно передать первые х элементов массива методу. Требования проекта не позволяют мне распределять любое распределение кучи, поэтому я не могу использовать какой-либо Array.Resize() или создавать новый массив.

Также я не могу изменить код SetVertices, потому что он принадлежит другой библиотеке. Ему нужно V[]. Я не могу передать IList<V> или V*.

public void BuildIt(V[] verts,int x){
    verts.Length = x; //Compile error
    mesh.SetVertices(verts);
}

Конечно, код не будет компилироваться. Мне нужна техника, например, методы отражения или расширения, чтобы скрыть массив как меньший без, фактически создавая меньший массив. Я хочу, чтобы метод SetVertices() думал, что массив имеет x членов, даже если он имеет больше.

EDIT:

Протестированы следующие подходы, и они не работают:

  • stackalloc не работает, потому что он не создает (или не может получить) реальный массив.
  • Peeking in mono project Я узнал, что свойство Length массива вызывает методы GetLenght() и GetRank() для определения длины. Если я плохо отношусь к практике, я не могу переопределить этот метод с помощью методов расширения, потому что методы экземпляра имеют приоритет над методами расширения (или есть способ принудительного отказа?).

Теперь попробуем ввести код.

EDIT2:

Пробовал испускать код в Array.GetLength() и Array.Length. Кажется, нет простой, надежной кросс-платформы и чистого способа изменения существующего тела метода во время выполнения.

4b9b3361

Ответ 1

Если вам действительно нужно сделать это с максимальной производительностью - тогда вы должны знать макет памяти для конкретной CLR, которую вы используете (кажется, какая-то версия Mono в вашем случае). Затем вы можете сделать небезопасный код, который изменит и восстановит длину массива. Но это не поддерживается и опасно.

Ответ 2

Если массивы и x не изменяются, а их число не велико, вы можете выделить их один раз глобально, а не локально. Таким образом, вы инвестируете в память и получаете производительность.