Почему я получаю «ссылка на объект не установлена на экземпляр объекта» при доступе к элементам нового массива?

#c# #.net #arrays

#c# #.net #массивы

Вопрос:

У меня есть следующий класс

 public class alumno
{
    public string nombre, matricula;
    public int semestre;

    public string []materias = new string [5];
    public double[] calif = new double[5];
}
  

И мне нужно создать массив, но я сталкиваюсь с ошибкой при доступе к нему.

 static void Main(string[] args)
{
    alumno[] als = new alumno[5];
    alumno al = new alumno(); // here i dont have problem
    al.nombre = "angel"; // here i dont have problem

    als[0].nombre = "angel"; // but here i DO have problem    
    als[0].semestre = 6;
    als[0].matricula = "123"; 
    als[0].materias[0] = "español";
    als[0].calif[0] = 10;
}
  

Ошибка, которую я получаю, это «Referencia a objecto no establecida como instancia de un objecto», что на
английском языке означает «Ссылка на объект, не установленная для экземпляра объекта»

Как я могу заполнить свои объекты в массиве?

Ответ №1:

 alumno[] als = new alumno[5]; 
  

Это создает массив, содержащий 5 элементов, но каждый элемент также должен быть создан.

 als[0] = new alumno();
// now you can access als[0].nombre
  

Вам нужно будет сделать это для каждого элемента в массиве, прежде чем вы сможете получить доступ к его элементам.

 for (int index = 0; index < als.Length; index  )
{
     als[index] = new alumno();
}
  

То, с чем вы столкнулись, формально известно как NullReferenceException . Недопустимо получать доступ к элементам (свойствам, методам) нулевой ссылки. Когда вы создаете массив, каждому элементу в массиве присваивается значение по умолчанию для типа. Для классов значение по умолчанию равно null, и именно поэтому вы столкнулись со своей проблемой.


Не связанные с вашей прямой проблемой, несколько вещей, о которых вы должны знать при написании кода на C #. Принято писать имена классов и общедоступных членов классов с заглавной буквы.

 class Alumno
{
     public string Nombre { get; set; }
}
  

Это также подчеркивает другое соглашение: в C # не является идиоматичным предоставлять поля-члены (переменные уровня класса) для общего доступа. Они скрыты. Мы предоставляем данные через свойства в коде C # (есть исключения, это скорее то, что вы называете рекомендациями, чем фактическими правилами).

Ответ №2:

Чего не хватает?

У вас есть ссылки на классы alumno, но нет объектов класса alumno.

 alumno[0] = new alumno();
alumno[1] = new alumno();
alumno[2] = new alumno();
alumno[3] = new alumno();
alumno[4] = new alumno();
  

То, что вы создали, было просто ссылочными переменными, а не объектами alumno.

Ответ №3:

По сути, то, что вы там делаете, — это создание массива нулевых значений, которые могут содержать 5 экземпляров класса alumno.

То, что вы хотите сделать, вероятно, что-то вроде

         alumno[] als = new alumno[5];


        //What You Need to Add  
        //VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

        for (int i = 0; i < als.Length; i  )
        {
            als[i] = new alumno();
        }

        alumno al = new alumno();
        al.nombre = "angel"; 

        als[0].nombre = "angel";  
        als[0].semestre = 6;

        als[0].matricula = "123";

        als[0].materias[0] = "español";
        als[0].calif[0] = 10;
  

Который создаст новый экземпляр вашего класса в каждом пространстве вашего массива