设置数组的长度属性

时间:2015-12-24 08:06:50

标签: c# arrays unity3d

是否可以使用某种技术更改数组的长度属性?

我需要将数组的前x个成员传递给方法。项目要求阻止我分配任何堆分配,因此我无法使用任何Array.Resize()或创建新数组。

同样我无法更改SetVertices代码,因为它属于另一个库。它需要V[]。我无法将IList<V>V*传递给它。

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

当然代码不会编译。我需要一些像反射或扩展方法这样的技术来将数组伪装成较小的而不用实际创建一个较小的数组。我希望SetVertices()方法认为数组有x个成员,即使它有更多。

修改

测试了以下方法但它们不起作用:

  • stackalloc不起作用,因为它没有创建(或者我无法获得)真正的数组。
  • 偷看单项目我发现数组的Length属性调用GetLenght()和GetRank()方法来确定长度。抛开一个不好的做法,我不能用扩展方法覆盖这个方法,因为实例方法优先于扩展方法(或者是否有办法强制使用?)。

接下来尝试代码注入。

EDIT2:

尝试将代码发送到Array.GetLength()Array.Length。似乎没有简单,可靠,跨平台和干净的方法来在运行时更改现有的方法体。

2 个答案:

答案 0 :(得分:1)

如果您真的必须以最高性能执行此操作 - 那么您必须知道您使用的特定 CLR的内存布局(在您的情况下似乎是某些版本的Mono)。然后,您可以执行一些不安全的代码来更改和恢复数组长度。但它不可维护危险

答案 1 :(得分:1)

如果数组和x没有改变且它们的数量不是很大,那么你可以在全局而不是本地分配它们。所以,你会投入记忆并获得表现。