c# Ссылка на объект [дубликат]

352
16 июня 2017, 07:26

На данный вопрос уже ответили:

  • Что такое NullReferenceException, и как мне исправить код? 2 ответа

Недавно начал кодить на 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)

Answer 1
else if (arg[0] == "add" && arg.Count() >= 2)
{
    switch (arg[1])
    {
        case ("test"):
            add = new string[] { "test_val" };
            //add[0] = "test_val";
            Console.WriteLine("Added test_key => test_val");
            break;
        default:
            //здесь не понятно что ты хочешь сделать?
            if (arg.Count() >= 3 && Int32.Parse(arg[1])>=0)
            {
                var a = Int32.Parse(arg[1]);
                add = new string[a + 1];
                add[Int32.Parse(arg[1])] = arg[2];
                Console.WriteLine("Added {0} => {1}", arg[1], arg[2]);
            }arg[2]);
            break;
    }
}
else if (arg[0] == "get" && arg.Count() >= 2)
{
    Console.WriteLine("Returned {0} => {1}", arg[1], add[Int32.Parse(arg[1])]);
}
READ ALSO
Отключить ContextMenu

Отключить ContextMenu

Доброй ночиВопрос такой: нужно отключить ContextMenu, если кликнули не на ListItem

238
Программным способом вставить таблицу(richtextbox)

Программным способом вставить таблицу(richtextbox)

Нужно нарисовать или вставить программным способом и чтобы можно было ее растягиватьИли же вставить как строки

261
Выбрать правильный компонент

Выбрать правильный компонент

Какой программный компонент Visual Studio оптимально подходит для вывода текстовых данных, изображений? Целесообразно ли использовать для этого...

230