«Ссылка на объект не установлена ​​для экземпляра объекта» при инициализации многомерного массива - PullRequest
1 голос
/ 19 июля 2010

Я выполняю следующий код на странице бритвы 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] = "#";

Заранее спасибо

Ответы [ 6 ]

6 голосов
/ 19 июля 2010

Вы инициализировали только первый элемент в 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" };
3 голосов
/ 19 июля 2010

У вас есть:

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] = "...";

И выне нужно инициализировать каждый элемент первого уровня новым массивом.

1 голос
/ 19 июля 2010

Я бы рекомендовал пойти с Отметить ответ Байерса или изменить код, чтобы использовать многомерный массив вместо зубчатого (массив массивов):

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 объектов, которые обрабатывают эту функцию для вас).

1 голос
/ 19 июля 2010

Проще вообще избежать проблемы и создать свой массив так:

string[,] menu = new string[,] {
    {"Home", "#"},
    // ...
    {"Test", "#"}
};
1 голос
/ 19 июля 2010

Вы правильно инициализируете первый массив:

menu[0] = new string[2];

но не все остальное, например, вам также нужно:

menu[1] = new string[2]; ..и так далее.

Надеюсь, это поможет!

0 голосов
/ 19 июля 2010

Вам нужно инициализировать каждый из подмассивов

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

В противном случае только меню [0] имеет двумерный массив для назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...