NullReferenceException по свойству массива объекта
У меня есть класс, реализованный как это:
class Person
{
public int ID { get; set; }
public string FName { get; set; }
public string LName { get; set; }
public double[] Fees { get; set; }
public Person() { }
public Person(
int iD,
string fName,
string lName,
double[] fees)
{
ID = iD;
FName = fName;
LName = lName;
Fees = fees;
}
}
Затем я пытаюсь проверить код в простом событии нажатия кнопки, например:
Person p = new Person();
p.ID = 1;
p.FName = "Bob";
p.LName = "Smith";
p.Fees[0] = 11;
p.Fees[1] = 12;
p.Fees[2] = 13;
for (int i = 0; i < p.Fees.Length; i++)
{
lstResult.Items.Add(p.ID + ", " + p.FName + ", " + p.LName + ", " + p.Fees[i]);
}
На данный момент я держу все очень просто и просто, чтобы получить то, что мне нужно.
Visual Studio выдает эту ошибку при запуске программы:
NullReferenceException was unhandled
Ошибка связана со свойством массива Fees объекта Person. Мне нужно иметь массив в качестве свойства объекта, чтобы я мог связать сборы с конкретным человеком. Поэтому, если то, что я пытаюсь сделать здесь, невозможно, я бы хотел сохранить то же самое в классе.
- Я правильно не создаю объект?
- Нужно ли делать что-то еще для инициализации свойства массива?
- Кто-нибудь может увидеть проблему, с которой я столкнулся?
Я готов поделиться идеями об использовании словаря или какой-либо другой структуры данных. но ТОЛЬКО если то, что я пытаюсь сделать здесь, абсолютно НЕ возможно.
Я посмотрел вокруг в Google и не повезло. Я посмотрел старые заметки класса и примеры проектов, и не повезло. Это моя последняя надежда. Кто-нибудь, пожалуйста, помогите. Спасибо всем заранее.
5 ответов
Вы пропускаете инициализацию массива, как указали другие.
p.Fees = new double[3];
Но универсальный список будет лучше подходить почти для всех мест, где вы будете использовать массив. Это все та же структура данных.
Список будет автоматически уменьшаться и расширяться при добавлении и удалении элементов в нем, что устраняет необходимость самостоятельно управлять размером массива.
Рассмотрим этот класс (обратите внимание, что вам нужно импортировать System.Collections.Generic)
using System.Collections.Generic;
class Person
{
public int ID { get; set; }
public string FName { get; set; }
public string LName { get; set; }
public List<double> Fees { get; set; }
public Person()
{ }
public Person(
int iD,
string fName,
string lName,
List<double> fees)
{
ID = iD;
FName = fName;
LName = lName;
Fees = fees;
}
}
Теперь вот как должен выглядеть ваш метод испытаний
Person p = new Person();
p.ID = 1;
p.FName = "Bob";
p.LName = "Smith";
p.Fees = new List<double>();
p.Fees.Add(11);
p.Fees.Add(12);
p.Fees.Add(13);
for (int i = 0; i < p.Fees.Count; i++)
{
lstResult.Items.Add(p.ID + ", " + p.FName + ", " + p.LName + ", " + p.Fees[i]);
}
Вам все еще нужно будет создать новый экземпляр свойства Fees, но вам не нужно беспокоиться об инициализации размера массива сейчас. Для бонусных баллов вы можете легко преобразовать его в массив, если вам нужно, используя ToArray()
p.Fees.ToArray();
Вам нужно инициализировать сборы. например
Person p = new Person();
p.ID = 1;
p.FName = "Bob";
p.LName = "Smith";
p.Fees = new double[] {11, 12, 13};
Добавить следующую строку
p.Fees = new double[3];
до
p.Fees[0] = 11;
Это
Person p = new Person();
p.ID = 1;
p.FName = "Bob";
p.LName = "Smith";
p.Fees[0] = 11;
p.Fees[1] = 12;
p.Fees[2] = 13;
следует перевести на это
Person p = new Person(1,"Bob","Smith",new double[]{ 11, 12, 13 });
В вашем конструкторе по умолчанию, который вы вызываете, вы не инициализируете fees
,
public Person() {
this.Fees = new double[10]; // whatever size you want
}