【问题标题】: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

标签: c# arrays unity3d


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2021-11-20
    • 2014-10-12
    相关资源
    最近更新 更多