【问题标题】:How to create array of 100 new objects?如何创建 100 个新对象的数组?
【发布时间】:2020-02-14 00:14:46
【问题描述】:

我正在尝试这样的事情:

class point
{
public int x;
public int y;
}

point[] array = new point[100];
array[0].x = 5;

这是错误: 对象引用未设置为对象的实例。 (@最后一行)

怎么了? :P

【问题讨论】:

标签: c# arrays


【解决方案1】:

它只创建数组,但所有元素都初始化为null。
您需要一个循环或类似的东西来创建您的类的实例。 (在这种情况下,foreach 循环不起作用) 示例:

point[] array = new point[100];
for(int i = 0; i < 100; ++i)
{
    array[i] = new point();
}

array[0].x = 5;

【讨论】:

  • 在这里添加到@Skalli 的答案,如果您的Point 是一个结构而不是一个类(因为Point 类型在BCL 中),那么您就不必担心这一点。类在数组中使用时需要“新建”,结构不需要。
  • 投了反对票的人:愿意解释一下您对这个问题的不满意之处以及我如何改进它?
  • 那不是我,但你的例子不正确。不能分配 foreach 迭代变量。必须有另一种循环类型: for (int i = 0; i
【解决方案2】:

当你这样做时

point[] array = new point[100];

您创建一个数组,而不是 100 个对象。数组元素为空。此时您必须创建每个元素:

array[0] = new point();
array[0].x = 5;

【讨论】:

    【解决方案3】:

    您可以将 class point 更改为 struct point 在这种情况下,new point[500] 将创建一个初始化为 0,0 的点数组(而不是 null 数组)。

    【讨论】:

      【解决方案4】:

      正如其他答案所解释的,您需要在每个数组位置初始化对象。您可以使用如下方法创建预初始化数组

      T[] CreateInitializedArray<T>(int size) where T : new()
      {
          var arr = new T[size];
          for (int i = 0; i < size; i++)
              arr[i] = new T();
          return arr;
      }
      

      如果你的类没有无参数构造函数,你可以使用类似的东西:

      T[] CreateInitializedArray<T>(int size, Func<T> factory)
      {
          var arr = new T[size];
          for (int i = 0; i < size; i++)
              arr[i] = factory();
          return arr;
      }
      

      两种方法的 LINQ 版本都很简单,但我认为效率略低

      【讨论】:

        【解决方案5】:
        int[] asd = new int[99];
        for (int i = 0; i < 100; i++)
            asd[i] = i;
        

        类似的东西?

        【讨论】:

        • 如果您要使用索引,最好使用for (int i=0; i &lt; asd.Length; ++i)我们不想冒IndexOutOfRangeException 的风险。 :)
        【解决方案6】:

        有时 LINQ 会派上用场。它可能会提供一些额外的可读性并减少样板和重复。缺点是需要额外的分配:创建枚举器并且 ToArray 事先不知道数组大小,因此可能需要多次重新分配内部缓冲区。 仅在可维护性比性能更重要的代码中使用。

        using System.Linq;
        
        const int pointsCount = 100;
        point[] array = Enumerable.Range(0, pointsCount)
            .Select(_ => new point())
            .ToArray()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-11
          • 2020-06-27
          • 1970-01-01
          • 2019-02-28
          • 2019-09-29
          • 2020-10-02
          相关资源
          最近更新 更多