【问题标题】:Are multi-dimensional arrays filled with null values when defined implicitly?隐式定义时,多维数组是否填充了空值?
【发布时间】:2012-11-18 02:25:28
【问题描述】:

我有:

public static BlockQuadrant[] EditModeBlocks = new BlockQuadrant[9];

但是当我尝试使用它们时,我得到一个空值异常,显然所有值都等于空。我认为这是我的BlockQuadrantinside 的值,但我在构造函数中定义了所有内容。如果是这种情况,有没有办法让它用BlockQuadrant 的实际实例而不是空值填充数组?

【问题讨论】:

    标签: c# arrays class multidimensional-array null


    【解决方案1】:

    当你构造一个 reference 对象数组时,它只构造一个数组,而不是其中的对象。您需要通过调用构造函数来初始化各个对象。

    您可以使用 LINQ 使用快捷方式,如下所示:

    public static BlockQuadrant[] EditModeBlocks = Enumerable
        .Range(0, 9)
        .Select(i => new BlockQuadrant())
        .ToArray();
    

    【讨论】:

    • @leaf68 Enumerable.Range(start, count) 产生九个数字的序列,从零到八。 Select(...) 忽略这些数字,并将它们替换为 new BlockQuadrant()。最后,ToArray() 将结果转换为数组。
    【解决方案2】:

    循环遍历数组和newing 元素是否有问题?

    for (int ii = 0; ii < EditModeBlocks.Length; ii++)
    {
        EditModeBlocks[ii] = new BlockQuadrant();
    }
    

    通过您的初始语句,您创建了一个具有默认值的数组。对于引用类型,默认值为null

    【讨论】:

      【解决方案3】:

      您必须在使用之前实例化数组中的每个元素,因为数组的元素中包含 null。

      public static BlockQuadrant[] EditModeBlocks = new BlockQuadrant[9];
      

      在一些静态方法中使用循环来实例化它们。

      private static someMethod()
      {
          for (int i = 0; i < EditModeBlocks.Length; i++)
          {
              EditModeBlocks[i] = new BlockQuadrant();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 2019-01-06
        相关资源
        最近更新 更多