设置数组的长度属性

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 inVertices)。您使用的是旧版本吗? (见:docs.unity3d.com/ScriptReference/Mesh.SetVertices.html 【参考方案1】:

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

【讨论】:

可能我必须把一些字加粗。 特定的 CLR不可维护危险【参考方案2】:

如果数组和 x 没有变化并且它们的数量不是很大,那么您可以全局分配它们一次,而不是本地分配。因此,您将投入内存并获得性能。

【讨论】:

以上是关于设置数组的长度属性的主要内容,如果未能解决你的问题,请参考以下文章

批量设置vue长度

JAVA中length()可以获得字符串和数组的长度对不对

Redux Dispatch - 从数组/不正确的数组长度输出中删除项目

php检测数组长度函数sizeof与count用法

java 为啥数组名.length就能获取数组的长度

在 vue.js 中查找数组长度时无法读取未定义的属性“长度”