Недавно начал кодить на c# и наткнулся на одно "магическое" исключение System.NullReferenceException: "В экземпляре объекта не задана ссылка на объект."
Пытался найти в гугле о ссылках и вроде нашёл, но так ничего не понял.
Надеюсь вы мне поможете разобраться с этой чёрной магией
Вот код (обновлено):
using System;
using System.Collections.Generic;
namespace ConsoleTest
{
class Program
{
public static string[] add;
static void Main(string[] args)
{
while (true)
{
Console.Write("> ");
var str = Console.ReadLine();
Console.WriteLine();
var arg = str.Split(' ');
if (arg[0] == "set")
{
add[Int32.Parse(arg[1])] = arg[2];
Console.WriteLine("Added {0} => {1}", arg[1], arg[2]);
}
else if (arg[0] == "get")
{
Console.WriteLine("Returned {0} => {1}", arg[1], add[Int32.Parse(arg[1])]);
}
}
}
}
}
(Слишком много правок XD)
Выдаёт ошибку на строке add[Int32.Parse(arg[1])] = arg[2];
Чуть подробнее
После запуска я пишу add 5 test потом Enter и вылезает ошибка.
По замыслу должно сделаться это (естественно ошибка не была в планах): add[5] = "test";
Строкой add[Int32.Parse(arg[1])] = arg[2]; я пытаюсь добавить в массив add значение arg[2] с индексом arg[1] (+ преобразование строки в число).
Массив arg это полученная строка через Console.ReadLine() и разбитая с помощью .Split(' ')
Массив add объявлен: public static string[] add;
Я путался добавлять пустые элементы так:
whlie(add[Int32.Parse(arg[1])] == null) { add.Add(""); }
но это не помогло.
Суть проблемы
Я не знаю конечного кол-ва мест для содержимого, т.к. это id сессии, номер которой может быть непредсказуемым.
И так, господа
Сегодня я вам всем изрядно напряг мозги, я благодарю вас за терпение.
Спасибо всем за советы, но до решения я дошёл сам
Т.к. я не нашёл кнопку ответа, то ответ тут
public static void _add(int key, string val) {
if (key >= add.Length) { Array.Resize(ref add, key + 1); }
add[key] = val;
foreach (var item in add)
{
Console.WriteLine(item);
}
}
Я добавил эту функцию и когда надо записать что-то в массив add я писал _add(index, value) и всё стало хорошо.
Теперь главное чтобы mono смог скомпилировать сие чудо (mcs на linux)
addнигде не назначается и остаётся с дефолтным значениемnull. – Jun 14 '17 at 17:19add[Int32.Parse(arg[1])] = arg[2];– code211218 Jun 14 '17 at 17:51public static string[] add;объявляете переменную, но не создаете массив, а здесьadd[Int32.Parse(arg[1])] = arg[2];пытаетесь писать в массив, но он же еще не был создан?! – Bulson Jun 14 '17 at 23:13addНЕ СОЗДАН:public static string[] add;, а объявлен - "почувствуйте разницу". – Jun 15 '17 at 14:52add = new string[123];- создает массив строк, в котором есть места для 123-х элементов. Аpublic static string[] add;- говорит, что в классе есть статическое поле, которое может указывать на массив строк, какой-нубудь длины, а может никуда не указывать (null) - что является его начальным состоянием. – Jun 15 '17 at 14:57.Resizeно проблема в том, что это только для .NET 4.5 – Дмитрий Jun 15 '17 at 15:05Dictionary<string, string>. – Jun 15 '17 at 15:15if (key >= add.Length)Вы не присваиваете значение. – Jun 15 '17 at 17:01