初始化多维数组时,“对象引用未设置为对象的实例”

时间:2010-07-19 14:55:17

标签: c# asp.net razor

我在ASP.NET razor页面(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] = "#";

提前致谢

6 个答案:

答案 0 :(得分:6)

您只是初始化了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" };

答案 1 :(得分: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] = "...";

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

答案 2 :(得分:1)

您正确初始化第一个数组:

menu[0] = new string[2];

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

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

希望有所帮助!

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

我建议使用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...

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

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

答案 5 :(得分:0)

您需要初始化每个子数组

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

否则只有menu [0]有一个要分配的二维数组。