在C#中为任意数量的元素初始化不可变结构的数组

时间:2014-03-20 03:58:06

标签: c# arrays initialization immutability

在C#4.0中,如果在编译时未定义元素数,我们如何初始化不可变数组。

例如,有这些结构:

struct MeshVertex
{
    public readonly Vector3 Position;
    public readonly Vector3 Normal;
    public readonly Color Color;
    public readonly Vector2 UV;
}

struct RenderVertex
{
    public readonly Vector4 Position;
    public readonly Vector4 Normal;
    public readonly Vector2 UV;

    public RenderVertex(MeshVertex vertex)
    {
        Position = vertex.Position;
        Normal = vertex.Normal;
        UV = vertex.UV;
    }
}

我有一个MeshVertex数组,我需要将其转换为RenderVertex数组,但我只能看到这些替代方案:

  1. 创建一个List,然后迭代每个MeshVertex并调用ToArray()。这样效率会降低。

    // mesh.Vertices is an array of MeshVertex
    List<RenderVertex> vertices = new List<RenderVertex>();
    foreach (MeshVertex vertex in mesh.Vertices)
        vertices.Add(new RenderVertex(vertex));
    
    Buffer.Create(device, BindFlags.VertexBuffer, vertices.ToArray())
    
  2. 删除readonly并使用可变数组,尽管这些结构在分配后不需要更改。这违反了我真正同意的不可变数组约定。

  3. 有没有其他方法可以将它们保留为不可变结构但不必分配另一个存储来创建目标数组?

1 个答案:

答案 0 :(得分:0)

尽管struct值是不可变的,但并不意味着它们不能分配到现有的数组元素中。例如

RenderVertex[] vertices = new RenderVertex[mesh.Vertices.Length];
for (int i = 0; i < mesh.Vertices.Length; i++) {
  vertices[i] = new RenderVertex(mesh.Vertices[i]);
}