1

我在 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] = "#";

提前致谢

4

6 回答 6

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" };
于 2010-07-19T15:00:21.600 回答
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] = "...";

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

于 2010-07-19T14:59:12.860 回答
1

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

string[,] menu = new string[,] {
    {"Home", "#"},
    // ...
    {"Test", "#"}
};
于 2010-07-19T15:00:54.057 回答
1

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

menu[0] = new string[2];

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

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

希望有帮助!

于 2010-07-19T14:58:45.387 回答
1

我建议使用Mark Byers 的答案,或者将代码更改为使用多维数组而不是锯齿状数组(数组数组):

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为您处理此功能的对象集合)。

于 2010-07-19T15:03:54.247 回答
0

您需要初始化每个子数组

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

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

于 2010-07-19T14:58:46.793 回答