#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;
Который создаст новый экземпляр вашего класса в каждом пространстве вашего массива