【问题标题】:"Object reference not set to an instance of an object" when initialising multi-dimensional array初始化多维数组时“对象引用未设置为对象的实例”
【发布时间】:2011-03-17 23:13:12
【问题描述】:

我在 ASP.NET 剃须刀页面 (cshtml) 上运行以下代码,并且遇到了可怕的“对象引用未设置为对象的实例”问题。有人可以帮我解决这个问题吗?我正在使用的代码如下,导致问题的行是menu[1][0] = "About";

string[][] menu = new string[5][];
menu[0] = new string[2];
// First menu item
menu[0][0] = "Home";
// First menu URL
menu[0][1] = "#";
// Second menu item
menu[1][0] = "About";
// Second menu URL
menu[1][1] = "#";
// Third menu item
menu[2][0] = "Contact";
// Third menu URL
menu[2][1] = "#";
// Fourth menu item
menu[3][0] = "More Info";
// Fourth menu URL
menu[3][1] = "#";
// Fifth menu item
menu[4][0] = "Test";
// Fifth menu URL
menu[4][1] = "#";

提前致谢

【问题讨论】:

    标签: c# asp.net razor


    【解决方案1】:

    你正确地初始化了第一个数组:

    menu[0] = new string[2];

    但不是其余的,例如你还需要:

    menu[1] = new string[2]; ..等等。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      你需要初始化每个子数组

      menu[0] = new string[2];
      menu[1] = new string[2];
      //etc..
      

      否则只有 menu[0] 有一个二维数组可以赋值。

      【讨论】:

        【解决方案3】:

        你有:

        menu[0] = new string[2];
        

        但是您需要在使用menu 的所有其他一级元素之前对其进行初始化。

        menu[1] = new string[2];
        menu[2] = new string[2];
        menu[3] = new string[2];
        menu[4] = new string[2];
        

        但值得注意的是,如果第二层的元素数量一致,则不需要使用交错数组。我不知道这是否只是您的示例数据中的巧合,但您可以这样做:

        string menu[,] = new string[5,2];
        

        这将允许您执行以下操作:

        menu[0,0] = "...";
        menu[0,1] = "...";
        ...
        menu[4,1] = "...";
        

        而且您不必将第一级的每个元素都初始化为新数组。

        【讨论】:

          【解决方案4】:

          您只初始化了menu 中的第一个元素。试试 for 循环:

          for (int i = 0; i < menu.Length; ++i)
          {
              menu[i] = new string[2];
          }
          

          你也可以这样写:

          string[][] menu =
          {
              new string[] {"Home", "#"},
              new string[] {"About", "#"},
              new string[] {"Contact", "#"},
              new string[] {"More Info", "#"},
              new string[] {"Test", "#"}
          };
          

          或者使用矩形数组代替:

          string[,] menu =
          {
              {"Home", "#"},
              {"About", "#"},
              {"Contact", "#"},
              {"More Info", "#"},
              {"Test", "#"}
          };
          

          由于您的第二个元素是恒定的,也许您根本不需要存储它 - 在这种情况下,您可以只使用 string[]

          string[] menu = { "Home", "About", "Contact", "More Info", "Test" };
          

          【讨论】:

          • 如果长度确实是一致的(使用for 循环需要它),那么首先,方形数组比锯齿状数组更合适。
          • 我不敢相信我忽略了矩形/锯齿状阵列!感谢您的出色回答。
          【解决方案5】:

          完全避免这个问题更容易,像这样创建你的数组:

          string[,] menu = new string[,] {
              {"Home", "#"},
              // ...
              {"Test", "#"}
          };
          

          【讨论】:

            【解决方案6】:

            我建议使用Mark Byers's answer,或者更改您的代码以使用多维数组而不是锯齿状数组(数组数组):

            string[,] menu = new string[5, 2];
            // First menu item
            menu[0, 0] = "Home";
            // First menu URL
            menu[0, 1] = "#";
            // Second menu item
            menu[1, 0] = "About";
            // Second menu URL
            menu[1, 1] = "#";
            // And so on...
            

            多维数组并不总是最好的解决方案,但我发现当你想确定你正在处理一个矩形维度的网格时,它们让生活更轻松(因此你不必对每个子数组执行检查比如它是否为null,它的长度是多少等)。

            说,我还建议您考虑将菜单设置从 string[] 数组这样的低级结构中抽象出来(例如,考虑将 Menu 类编写为MenuItem 为您处理此功能的对象)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多