C#固定大小的数组

时间:2018-12-13 19:38:31

标签: c# arrays

我开始学习C#,并且通常使用C ++。 我正在尝试调整很多方法,但是std::array似乎是不可能的...

我只想运行这种代码:

public struct Foo {};
public struct Test 
{ 
    public Foo value[20]; 
};

我不想每次使用此结构时都进行分配,也不想使用任何类。 我看到了fixed关键字,但它仅适用于基本类型... 有没有像std::array这样简单的东西? 我什至可以在C语言中做到这一点。

您将如何解决这个问题? (即使它仍然是动态分配的。)

2 个答案:

答案 0 :(得分:0)

使用固定大小的缓冲区(fixed)仅适用于基本类型,因为其用途旨在互操作。数组类型是引用类型,因此它们可以具有动态大小:

public struct Test 
{ 
    public Foo[] value; 
}

但是请注意,复制结构只会复制引用,因此数组将相同。我建议您要么使类型不可变(通过禁用对数组的写操作),要么将struct更改为class并显式控制克隆。

在C#中,没有固定大小的按值数组类型的东西(尽管我曾经提出过)。最接近它的是值元组。

答案 1 :(得分:-2)

因此,似乎没有办法不像在编译时动态分配已知内容那样愚蠢。但这是C#,所以我只需要...尝试闭上眼睛。 无论如何,我做了一些事情来同时解决数组别名和固定数组(在这个问题上我没有问过数组别名)。

public abstract
class Array<T>
{
  private T[]  data;

  protected Array(int size) { data = new T[size]; }
  public T this[int i]
  {
    get { return data[i]; }
    set { data[i] = value; }
  }
};

public Alias : Array<int>
{
  static public int Length = 10;
  public Area() : base(Length) {}
};

有人说用C#编写代码更快。 如果有人更好,我会很乐意接受!