1


0

多次元配列を初期化するときの「オブジェクト参照がオブジェクトのインスタンスに設定されていません」

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 Answer


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


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];

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

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

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

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

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


1


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

menu [0] =新しい文字列[2];

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

menu [1] = new string [2]; ..など。

それが役立つことを願っています!


1


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

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


1


https://stackoverflow.com/questions/3282193/object-reference-not-set-to-an-instance-of-an-object-when-initialising-multi-di/3282232#3282232 [ 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、その長さなど)。

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


0


各サブ配列を初期化する必要があります

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

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