2017-01-28 1 views
0

Извинения за то, что, вероятно, является немым вопросом, но я думаю, что я закипил свой код по основным проблемам, из которых есть два, которые меня заставляют орехи. Буду признателен за любую помощь.Сфера применения/Ссылка на объект и объект не установлена ​​в экземпляр объекта

В приведенном ниже коде первая проблема заключается в том, что мой отладочный код попадает в строку 'bus [0] ..' Я получаю ссылку на объект, не установленную на экземпляр объекта ', хотя я просто создал экземпляр класса в предыдущей строке.

Моя следующая проблема заключается в том, что класс «SystemArrays» предназначен для репозитория, видимого всеми моими классами (например, «Solver»), где они могут получить & Установите его общедоступные свойства. Тем не менее, я не могу понять, как и где создавать экземпляр класса, чтобы сделать его видимым для всех.

Любая помощь была бы принята с благодарностью. Благодарю.

public Form1() 
    { 
     InitializeComponent(); 
    } 

    SystemArrays newArray = new SystemArrays(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Bus[] bus = new Bus[3]; 
     bus[0].elementNum = 5; 
     bus[1].elementNum = 8; 
     bus[2].elementNum = 26; 

     newArray.buses[0].elementNum = bus[0].elementNum; 
    } 

    public class SystemArrays 
    { 
     public Bus[] buses { get; set; } 
    } 

    public class Bus 
    { 
     public int elementNum { get; set; } 
    } 

    public class Solver 
    { 
     // int x = newArray.buses[0].elementNum; 
    } 
+0

К сожалению сообщение содержит 2 несвязанных вопросы - таким образом, основной замкнута в двух экземплярах, ответ на второй можно найти с помощью поиска https://www.bing.com/search ? q = c% 23% 20property% 20accessible% 20to% 20all% 20classes и закрыто как дубликат http://stackoverflow.com/questions/7679230/how-to-make-a-object-accessible-through-all-files -в-c-sharp, например. –

ответ

2

1. Вы инициализируя массив, а не инициализируя объекты внутри массива и, следовательно, получая ссылку на объект , не установленную в экземпляр объекта исключение. Итак, вам нужно внести изменения кода, как

Bus[] bus = new Bus[3]; 
bus[0].elementNum = 5; 

Для

Bus[] bus = new Bus[3]; 
bus[0] = new Bus(); 
bus[0].elementNum = 5; 

2. Для того, чтобы newArray общественности, установить правильный доступ, указав правильный уровень защиты, как public, как вам нужно выставить класс другим классам. Кроме того, вы можете объявить его статичным, если вам нужна одна копия newArray, хотя лучше создать свойство get для такого сценария.

public static SystemArrays newArray = new SystemArrays(); 
+0

Ничего себе, ребята, спасибо. Это действительно неловко. Я продолжаю повторять ту же самую ошибку снова и снова. Опять же, мои аполиги за тупой вопрос –

+0

Что неловко, что этот ответ даже отправлен - вопрос содержит 2 несвязанных вопроса, и первый из них четко объясняется в хорошо известном дубликате. –

1

Вы получаете исключение «Объект ссылка не в экземпляр объекта», потому что это именно то, что происходит. Вы создали массив из 5 элементов (автобусов), но вы их не инициализировали. После создания массива все его элементы содержат значение по умолчанию для типа массива. В вашем случае тип массива Bus (ссылочный тип) и значение по умолчанию всех ссылочных типов является null

Вы можете инициализировать значения вашего массива, просто присвоив:

bus[0] = new Bus(); 
1

Проблема в том, что вы создаете массив, но не отдельные экземпляры. Вы можете использовать следующий компактный способ:

var buses = new Bus[3] // instantiate an array object of size 3 
{ 
    new Bus() { elementNum = 5 }, // instantiate new Bus object 
    new Bus() { element = 8 }, // and here 
    new Bus() { elementNum = 26 } // and here 
}; 
Смежные вопросы