1

使用 Visual Studios 2010 C#

所以我正在为 ac# 项目制作一个数据结构,它的成员中将包括另一个结构类型的数组。因此,例如,这是我的代码的精简想法:

    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

4 回答 4

4

这里的问题是您将结构设为私有,这意味着您无法创建它们的实例。让他们公开。并且还摆脱了 ; 在最后

public struct scores
{

    public double finalScore;


}

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

}

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

于 2013-06-25T04:50:27.863 回答
3

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

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

    // Constructor
    public information(String nameValue) {
      name = nameValue;
      scoreList = new scores[10]; // <- It's possible here
    }
  };
于 2013-06-25T04:52:14.717 回答
3

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

显示这一点的最佳方式是例如通过数组。假设您创建了一个类类型的数组,例如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. 但是,一个更简单的解决方案是只使用 aclass代替。

于 2013-06-25T04:55:46.763 回答
0

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

  • 使用unsafe代码在fixed结构中包含一个或多个基元数组;让您的索引 get/put 访问器根据存储在这些数组中的信息组装一个结构。例如,如果你想表现得像一个 的数组Point,可以有一个fixed用于所有X坐标的fixed数组和一个用于所有 Y 坐标的数组,然后让this[int]getterPoint通过组合 anXYvalue 来构造 a,而this[int]setter 存储 X和传入点的 Y 值。
  • 有多个结构类型的字段,让this[int]getter 从其中一个读取,让this[int]setter 写入其中一个。有一些方法可以使它的效率不会太低,但它仍然相当恶心。
  • 让结构持有适当结构类型的私有数组。和访问getset应该看起来像:

    T[] _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);
    }};
    

    这种方法将允许 get 索引器比第二种方法(可能也是第一种方法)运行得更快,并且与第一种方法不同,它将适用于泛型类型。这种方法的主要缺点是每次set运行它的访问器时,它都必须制作一个新的数组副本。但是,如果写入频率远低于读取频率,那可能不是问题。顺便说一句,正如所写的那样,代码应该是完全线程安全的——这对于可变结构是可能的,但对于假装不可变的结构则不可能。

  • 于 2013-06-25T16:21:55.720 回答