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", "#"}
};

また、2番目の要素は一定であるため、おそらくそれを保存する必要はまったくありません。この場合は、を使用するだけで済みますstring[]

string[] menu = { "Home", "About", "Contact", "More Info", "Test" };
于 2010-07-19T15:00:21.600 に答える
3

あなたが持っている:

menu[0] = new string[2];

ただし、使用する前に、の他のすべての第1レベルの要素を初期化する必要がありmenuます。

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

ただし、第2レベルの要素数が一貫している場合は、ジャグ配列を使用する必要がないことに注意してください。これがサンプルデータの単なる偶然であるかどうかはわかりませんが、次のことができます。

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

これにより、次のようなことができます。

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

また、最初のレベルのすべての要素を新しい配列に初期化する必要はありません。

于 2010-07-19T14:59:12.860 に答える
1

最初の配列を正しく初期化します。

menu[0] = new string[2];

ただし、残りは必要ありません。たとえば、次のものも必要です。

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

お役に立てば幸いです。

于 2010-07-19T14:58:45.387 に答える
1

問題を完全に回避し、次のように配列を作成する方が簡単です。

string[,] menu = new string[,] {
    {"Home", "#"},
    // ...
    {"Test", "#"}
};
于 2010-07-19T15:00:54.057 に答える
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...

多次元配列は必ずしも最良の解決策ではありませんが、長方形の次元のグリッドを処理していることを確認したい場合は、作業が楽になると思います(したがって、各サブ配列でチェックを実行する必要はありません。 null、長さなど)。

とは言うstring[]ものの、配列などの低レベルの構造からメニュー設定を抽象化することを検討することもお勧めします(たとえば、この機能を処理するオブジェクトMenuのコレクションとしてクラスを作成することを検討してください)。MenuItem

于 2010-07-19T15:03:54.247 に答える
0

各サブアレイを初期化する必要があります

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

それ以外の場合、menu[0]のみに割り当てる2次元配列があります。

于 2010-07-19T14:58:46.793 に答える