设置数组的长度属性
Posted
技术标签:
【中文标题】设置数组的长度属性【英文标题】:Set Array's Length property 【发布时间】:2015-12-24 08:06:50 【问题描述】:是否可以通过某种技术更改数组的 Length 属性?
我需要将数组的前 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 不起作用,因为它没有创建(或者我无法获得)真正的数组。 查看 mono 项目,我发现数组的 Length 属性正在调用 GetLenght() 和 GetRank() 方法来确定长度。除了一个不好的做法,我不能用扩展方法覆盖这个方法,因为实例方法优先于扩展方法(或者有其他方法强制吗?)。接下来尝试代码注入。
EDIT2:
尝试将代码发送到 Array.GetLength()
和 Array.Length
。似乎没有简单、可靠、跨平台和干净的方法来在运行时更改现有方法体。
【问题讨论】:
我认为不可能。 几乎不可能编写任何有意义的 C# 而不分配一些东西。这有多严格,根本原因是什么? 上述问题无法解决。有些东西必须付出。你应该回答@alexm。 我看不出如何在不更改供应商 API 的情况下避免分配。我会要求供应商添加一个重载 SetVertices(V[] verts, int startIndex, int count); 顺便说一句:Unity 网站说签名是 (List如果您确实必须以最高性能执行此操作 - 那么您必须了解您使用的 特定 CLR 的内存布局(在您的情况下似乎是某个版本的 Mono)。然后你可以做一些不安全的代码来改变和恢复数组长度。但它不可维护且危险。
【讨论】:
可能我必须把一些字加粗。 特定的 CLR,不可维护,危险【参考方案2】:如果数组和 x 没有变化并且它们的数量不是很大,那么您可以全局分配它们一次,而不是本地分配。因此,您将投入内存并获得性能。
【讨论】:
以上是关于设置数组的长度属性的主要内容,如果未能解决你的问题,请参考以下文章