如何在结构中声明一个结构数组?

时间:2013-06-25 04:46:01

标签: c# arrays struct

使用Visual Studios 2010 C#

所以我正在为一个c#项目创建一个数据结构,它的成员中包含一个类型为另一个结构的数组。例如,这里是我的代码的简要概念:

    private struct scores
    {

        public double finalScore;


    };

    private struct information
    {
        public string name;
        public scores[] scoreList;

    };

我写这篇文章时收到以下警告:

  

错误1'WindowsFormsApplication1.main.information.scoreList':不能   在结构中有实例字段初始值设定项

我想知道什么是正确的方法来声明结构信息的score [] scoreList方面,所以我可以将数组大小设置为10?

我尝试过的事情:

  • 如果我尝试

    公共分数[] scoreList =新分数[10]

我收到以下错误

  

错误1'WindowsFormsApplication1.main.information.scoreList':不能   在结构中有实例字段初始值设定项

4 个答案:

答案 0 :(得分:4)

这里的问题是你将结构设为私有,这意味着你不能创建它们的实例。让它们公开。而且还摆脱了;最后

public struct scores
{

    public double finalScore;


}

public struct information
{
    public string name;
    public scores[] scoreList;

}

我通常不使用结构,因为它们的OO限制以及它们不可为空的事实。但是.Net中有几个结构:DateTime,int,float等......

答案 1 :(得分:3)

在结构中,您只能在构造函数中进行初始化:

  struct information {
    public string name;
    public scores[] scoreList;

    // Constructor
    public information(String nameValue) {
      name = nameValue;
      scoreList = new scores[10]; // <- It's possible here
    }
  };

答案 2 :(得分:3)

你不能这样做。原因是结构是值类型。 struct的默认构造函数是一个无参数构造函数,它将所有字段初始化为其默认值。您无法控制此构造函数,因为它们是值类型。

显示此信息的最佳方法是通过一个数组。假设您创建一个类类型的数组,例如new object[10]。此数组的项目将初始化为null。但是,当你创建一个结构数组时,例如new information[10],数组的项目已经是有效的实例。但是,这些项上的构造函数将不会运行,并且所有字段都将初始化为其空值。在您的情况下,这意味着所有字段都为null

这有两个解决方案。第一种解决方案是创建工厂方法,例如:

public static information CreateNew()
{
    var result = new information();
    result.scoreList = new scores[10];
    return result;
}

这会奏效。您只需使用information.CreateNew()而不是new information()创建实例,并且您将初始化information。但是,更简单的解决方案是使用class代替。

答案 3 :(得分:0)

有三种方法可以使结构表现为值类型的结构数组:

  • 使用unsafe代码在您的结构中包含一个或多个fixed基元数组;让你的索引get / put访问器从存储在那些数组中的信息中组装一个结构。例如,如果您想表现得像Point数组,则可以为所有fixed坐标设置X数组,为所有Y坐标设置fixed数组,然后让this[int] getter通过组合PointX值构建Ythis[int] setter存储来自的this[int]和X值传入点。
  • 拥有结构类型的多个字段,并从其中一个读取this[int] getter,并将get setter写入其中一个。有一些方法可以使这不是非常低效,但它仍然相当icky。
  • 让结构保存适当结构类型的私有数组。 setT[] _array; T this[int index] { get { T[] temp_array = _array; if (temp_array == null) return default(T); return temp_array[index]; } set { do { T[] was_array[] = _array; T[] new_array = (temp_array == null) ? new T[size] : (T[])(temp_array.Clone()); temp_array[index] = value; } while (System.Threading.Interlocked.CompareExchange(ref _array, new_array, was_array) != was_array); }}; 访问者应该类似于:

    set

    这种方法将允许get indexer比第二种方法(也可能是第一种方法)更快地运行,并且与第一种方法不同,它将与泛型类型一起使用。这种方法的主要缺点是每次运行{{1}}访问器时,它必须创建一个新的数组副本。但是,如果写入比读取频率低得多,则可能不是问题。顺便提一下,正如所写的那样,代码应该是完全线程安全的 - 这可以通过可变结构实现,但对于假装不可变的结构是不可能的。